1. 문제 상세
https://www.acmicpc.net/problem/1436
2. 문제 접근
n 번째로 작은 666이 나오는 숫자를 찾자.
숫자를 666부터 1씩 더해가며 확인하고, 666이 나오는 숫자를 찾으면 카운트,
카운트가 n 과 같아지면 그만두고 그 숫자를 출력하도록 하자.
확인하는 과정에서는 숫자를 1000으로 나눠보고 나머지가 666인지 확인,
아니라면 10으로 나누고 다시 확인하는 과정을 반복하도록 하자.
3. 문제 풀이
#include <iostream>
using namespace std;
int main() {
int n, count = 0, end = 665;
cin >> n;
while (count != n) {
end++;
int temp = end;
while (temp != 0) {
if (temp % 1000 == 666) {
count++;
break;
}
temp /= 10;
}
}
cout << end;
}
정수형 변수 n, count, end 를 선언하고 count 는 0, end 는 665 로 초기화한다.
// 반복문에서 end 에 1을 더하고 시작 할 것이기 때문에 665 부터 시작하도록 한다.
cin 으로 정수(문제의 N) 을 입력받아 n 에 저장한다.
while문으로 count 가 n 과 다를 때 반복하도록 한다. // n 번째로 작은 수를 찾을 때 까지 반복한다.
end 에 1을 더해주고 정수형 변수 temp 를 선언하여 값을 end 의 값으로 초기화한다.
/* end 의 값을 직접 참조하여 확인하면 확인이 끝난 후 end 의 값이 0이 되어버린다.
따라서 end 의 값을 temp 에 저장하고 temp 를 참조하여 666이 나오는지 확인한다. */
다시 while문으로 temp 가 0이 아닐 때 반복하도록 한다.
반복에서는 if문으로 temp 를 1000으로 나눈 나머지가 666이라면 count 에 1을 더하고 break 로 반복을 빠져나간다.
// 666이 나오면 다음 수로 넘어가며, 카운트로 해당 숫자가 몇 번 째로 작은 종말수인지 확인 가능하도록 한다.
아닌 경우 temp 의 값을 10으로 나눈다. // 앞의 자리에 연속으로 666이 나오는지 확인할 수 있도록 한다.
위의 반복이 끝나면 cout 으로 end 를 출력한다.
4. 성능 확인
5. 마무리
.
'백준 - 단계별로 풀어보기 > 브루트 포스' 카테고리의 다른 글
[백준] 2839번 : 설탕 배달 | C++ (0) | 2023.11.01 |
---|---|
[백준] 1018번 : 체스판 다시 칠하기 | C++ (0) | 2023.11.01 |
[백준] 19532번 : 수학은 비대면강의입니다 | C++ (1) | 2023.10.31 |
[백준] 2231번 : 분해합 | C++ (0) | 2023.10.31 |
[백준] 2798번 : 블랙잭 | C++ (0) | 2023.10.31 |