www.acmicpc.net/problem/2840

 

2840번: 행운의 바퀴

첫째 줄에 마지막 회전에서 화살표가 가리키는 문자부터 시계방향으로 바퀴에 적어놓은 알파벳을 출력한다. 이때, 어떤 글자인지 결정하지 못하는 칸은 '?'를 출력한다. 만약, 상덕이가 적어놓

www.acmicpc.net

1. 풀이방법 

- 구현자체는 어렵지 않습니다..

 

- 배열은 ?로 초기화 해주고

 

- 조건에 따라 INDEX를 취향 껏 조절하시면 됩니다. (방향에 맞춰)

 

 

 

2. 주의사항

- 많이 틀린 이유......예외사항이 중요합니다....

 

- (1) 같은 문자가 바퀴에 중복으로 붙여져서는 안된다.

 

- (2) 한 자리에 여러개의 문자가 붙여질 수는 없다.

 

- 이 떄는 !를 출력해야합니다.

 

- !!!!! 단, 입력은 돌리면서 상황을 보여주는 것이기 때문에 돌렸을 때 상황이 같은 자리를 가리킬 수도 있기 때문에

 

- 입력으로 같은 문자가 두번이 들어와도 그것이 같은자리를 가리키고 있는 경우에는 허용이 됩니다...!!

 

- 이를 조건문에 추가로 걸어주어야 합니다 !

 

- 너무 쉽다생각했다가 예외처리에서 애좀 먹은 문제입니다...ㅠ

 

 

 

3. 나의코드

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

int N, K;
void setpan(vector<char> &pan) {
	for (int i = 0; i < N; i++) {
		pan[i] = '?';
	}
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	cin >> N >> K;
	vector<char> pan(N);
	setpan(pan);
	int index;
	for (int i = 0; i < K; i++) {
		int count; char tmpc;
		cin >> count >> tmpc;
		if (i == 0) { pan[0] = tmpc; index = 0; continue; }
		index = (count + index) % N;
		//돌렸을 때 같은문자(같은 자리)는 나올 수 있다. 그것마저 아니면 틀린 원판
		if (pan[index] != '?'&& pan[index] != tmpc) { cout << "!"; return 0; }
		else {
			pan[index] = tmpc;
		}
	}
	//중복체크
	for (int i = 0; i < N; i++) {
		for (int j = i + 1; j < N; j++) {
			if(pan[i]!='?' &&pan[i]==pan[j]) { cout << "!"; return 0; }
		}
	}
	for (int i = 0; i < N; i++) {
		cout << pan[index];
		index--;
		if (index == -1) index = N - 1;
	}
	return 0;
}

'알고리즘 문제풀이 > 구현' 카테고리의 다른 글

백준 14503 [C++]  (0) 2020.12.08
백준 14891 [C++]  (0) 2020.12.06
백준 2033 C++  (0) 2020.11.25
백준 14890 [C++]  (0) 2020.10.21
백준 17406 [C++]  (0) 2020.10.18

https://www.acmicpc.net/problem/15552

 

15552번: 빠른 A+B

첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.

www.acmicpc.net

- 아주 간단한 문제이지만

- 시간 제한과 매우 큰 테스트 케이스 사이즈 인 문제이다.

- cin.tie(NULL);
 -ios_base::sync_with_stdio(false);

-자료구조 실습 때나 문제해결기법 실습 때 c말고 c++ 을 쓰는 학생들도 있었기 때문에

 실습 문제의 아래 cin/cout을 사용할 경우 위에 저것을 선언해주어라

- 는 말이 항상 있었는데 구체적으로 어떤 역할을 하는지가 궁금해져서 이 기회에 알아보았다.

< cin.tie(NULL) >

default값은 cout,cin이 tie 되어 있다.

이것을 untie 하겠다.라는 것

이경우 라면 program 이 user에게 입력을 요구하기 전에 output이 flush 된다.

(기본적으로 cout의 output은 buffer가 가득차거나 수동적으로 flush 시켜전까지는 출력되지 않는다.)

만약 cin과 cout을 untie 한다면, cin으로 입력을 받기 전에 뭔가를 띄우고 싶다면 매번 수동적으로 cout을 flush 시켜줘야 한다.

 

ios_base::sync_with_stdio(false);

c 표준 stream과 c++ 표준 stream 의 동기화를 끊는다.

default는 모두 동기화 되어 있다 그래서 우리는 c,c++ 입출력 방식을 자유롭게 쓸 수 있다.

printf도 쓸 수 있고 cout도 쓸 수 있따.

이 동기화를 끊어 주면 c++ stream들은 독립적인 버퍼를 갖게되고, c와 혼용해서 쓰는 것이 위험해진다.

그리고 동기화된 c++ stream 은 thread-safe 하다.( 다른 thread의 output이 동시에 엑세스 해도 충돌하지 않는다.

동기화를 끊으면 사용하는 버퍼의 수가 줄어들기 때문에 실행속도 자체는 향상된다.

 

출처:https://codecollector.tistory.com/381

찾아보고 직접 코드를 작성하여 실행 해보았는데 나는 untie를 하고 나서

내가 스스로 flush를 해주지 않았는데도 출력이 잘 되었다...왜지?

 

*아 그리고 endl과 '\n'의 차이

이 문제에서 위의 두 사항을 모두 적용하고 출력해보았는데 

시간초과가 나왔는데 그 차이는 endl과 '\n' 의차이 였는데

endl은 개행만 해주는 것이 아니고 내부 버퍼도 비워주기 때문에 '\n'에 비해서 매우 느리다.

이것또한 알아두자 .

 

 

'학부생 공부 > 연습문제(백준)' 카테고리의 다른 글

백준 2164 카드2  (0) 2019.11.13
백준 2839 설탕배달  (0) 2019.11.10
백준 1085  (0) 2019.11.09
백준 11365 !밀비 급일  (0) 2019.11.06
백준 1002  (0) 2019.11.06

+ Recent posts