c++/알고리즘

[c++] 백준- 1436 영화감독 숌

hojung 2022. 4. 28.
728x90
반응형

문제는 위와 같았다. 사실 처음에 문제를 보고 많은 고민을 했다. 처음에는 엥 걍 숫자 증가시키면서 뒤에 666만 붙여주면 되는 거 아닌가? 했다가 6660 6661 .... 등의 존재를 깨달으며 이거 뭐지..?하는 심정이었다. 

그 후 패턴이 있을까하며 아이패드로 계속 찾아가보면서 패턴을 찾으려했지만 

무의미한 발악이었다. 때로는 이러한 패턴을 찾는 거보다 컴퓨터를 쓰는 이유는 단순 무식한 작업을 놀라운 속도로 하기 때문이잖아! 라는 생각이 들어서 그냥 i를 하나씩 증가시켜보면서 666이라는 패턴을 찾으면 횟수를 1 감소시키는 방법은 어떨까?라는 생각을 하게 되었다. 따라서 막막해보이던 문제 풀이 방법이 떠올랐고 처음 생각했을 때 뭐 6을 만나면 다른 처리를 해주고 자리수에 따라서도 다르게 해주어야하나...?와 같이 복잡한 생각을 하던 처음과 달리 답은 굉장히 간단했다. 

#include <iostream>
#include <string>
using namespace std;

int n;
int res;
int main() {
	cin >> n;
	for (int i = 666; ; i++) {
		if (to_string(i).find("666") != string::npos) {
			n--;
		}
		else n;


		if (n == 0) {
			res = i;
			break;
		}
	}
	cout << res;
}

패턴을 찾아야하기 때문에 i를 to_string함수를 이용해서 string으로 변환해주고 그 변환된 것에서 find함수를 통해 666이라는 패턴을 찾아주기만하면 되는 것이었다. 하지만 여기서 조심할 점은 string의 find함수는 boolean형태로 반환하는 것이 아니라 문자열에서 찾은 위치를 반환해준다. 만일 패턴이 없다면 npos라는 값을 반환하는데 이는 namespace std에서는 존재하지 않고 string namespace에 존재하니 string::npos라고 정의해주면 된다. 따라서 666에 해당하는 패턴을 찾으면 입력받은 횟수 n을 감소시키는 방향으로 코드를 작성하면 

정답이다!

728x90
반응형

댓글