본문 바로가기
코딩테스트 준비/백준

[백준 1436번][C++] 영화감독 숌

by 스테디코디스트 2023. 7. 15.
반응형

<문제 소개>


<소스 코드>

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <map>
#include <cmath>
#include <stack>
#include <queue>
#include <algorithm>
#include <cstdlib>
using namespace std;

int main()
{	
	int result = 0;
	
	int N;
	cin >> N;

	int startNum = 665;

	while (N > 0)
	{
		startNum++;

		string curNum = to_string(startNum);		

		for (int i = 0; i < curNum.size() - 2; i++)
		{
			string subCurNum;

			for (int j = 0; j < 3; j++)
			{
				// 3자리의 연속된 수를 하나씩 담음
				subCurNum.push_back(curNum[i + j]);
			}

			if (subCurNum == "666")
			{
				// 666을 포함하고 있는 경우
				N--;
				break;
			}
		}
	}

	result = startNum;

	cout << result;

	return 0;
}

<풀이과정>

1. startNum을 666부터 시작하고, curNum에 int형 startNum을 string형으로 바꿔서 저장한다.

2. curNum의 앞의 3자리부터 마지막 3자리까지 666과 일치하는지를 찾는다.

3. 중간에 일치하는 것이 나오면 N을 감소시키고, result에 해당 startNum을 넣어준다.

4. 이 과정을 N이 0보다 큰 동안 반복해서 N번째 종말의 수 를 구한다.


 

<코멘트>

처음엔 어떻게 풀어야될까 헷갈렸는데 풀다보니깐 쉬웠다.

근데 시간이 오래걸리는데 이게 맞는건가 싶어서 다른 분들의 풀이도 찾아보았다.

찾아보니 문자열에 담지않고 1000으로 나눈 나머지와 666을 비교해서 숫자로 판단하는 풀이가 있었다!

확실히 시간이 단축되었다!


<추가 소스코드>

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <map>
#include <cmath>
#include <stack>
#include <queue>
#include <algorithm>
#include <cstdlib>
using namespace std;

int main()
{	
	int result = 0;
	
	int N;
	cin >> N;

	int startNum = 665;

	while (N > 0)
	{
		startNum++;

		int curNum = startNum;

		while (curNum >= 666)
		{
			if (curNum % 1000 == 666)
			{
				// 666이 들어가는 경우
				N--;
				break;
			}

			// 일의 자리 없앰
			curNum /= 10;
		}
	}

	result = startNum;
	cout << result;

	return 0;
}