문제
666은 종말을 나타내는 숫자라고 한다. 따라서, 많은 블록버스터 영화에서는 666이 들어간 제목을 많이 사용한다. 영화감독 숌은 세상의 종말 이라는 시리즈 영화의 감독이다. 조지 루카스는 스타워즈를 만들 때, 스타워즈 1, 스타워즈 2, 스타워즈 3, 스타워즈 4, 스타워즈 5, 스타워즈 6과 같이 이름을 지었고, 피터 잭슨은 반지의 제왕을 만들 때, 반지의 제왕 1, 반지의 제왕 2, 반지의 제왕 3과 같이 영화 제목을 지었다.
하지만 숌은 자신이 조지 루카스와 피터 잭슨을 뛰어넘는다는 것을 보여주기 위해서 영화 제목을 좀 다르게 만들기로 했다.
종말의 숫자란 어떤 수에 6이 적어도 3개이상 연속으로 들어가는 수를 말한다. 제일 작은 종말의 숫자는 666이고, 그 다음으로 큰 수는 1666, 2666, 3666, .... 과 같다.
따라서, 숌은 첫 번째 영화의 제목은 세상의 종말 666, 두 번째 영화의 제목은 세상의 종말 1666 이렇게 이름을 지을 것이다. 일반화해서 생각하면, N번째 영화의 제목은 세상의 종말 (N번째로 작은 종말의 숫자) 와 같다.
숌이 만든 N번째 영화의 제목에 들어간 숫자를 출력하는 프로그램을 작성하시오. 숌은 이 시리즈를 항상 차례대로 만들고, 다른 영화는 만들지 않는다.
입력
첫째 줄에 숫자 N이 주어진다. N은 10,000보다 작거나 같은 자연수이다.
출력
첫째 줄에 N번째 영화의 제목에 들어간 수를 출력한다.
Solved.ac 레벨
실버 V
풀이
#include <bits/stdc++.h>
using namespace std;
int n;
int cnt;
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> n;
for(int i = 666; ; i++){
string tmp = to_string(i);
for(int j = 0; j < tmp.length(); j++){
if(tmp[j] == '6' && tmp[j+1] == '6' && tmp[j+2] == '6'){
cnt++;
break;
}
}
if(cnt == n){
cout << i << '\n';
break;
}
}
return 0;
}
PS를 공부하는 방법을 좀 바꿔보기로 했다.
기존에는 DP, BFS, 그리디 등 각 알고리즘 별로 분류되어있는 문제집을 저장해놓고 풀었는데, 그러다보니 '당연히 이 문제는 이 알고리즘이지.' 하며 푸는 바람에 실제 코테나 대회에서 부족하지 않을까 하는 생각이 들었기 때문이다.
Solved.ac에는 CLASS라는 개념이 있어서, 해당 클래스를 따라가면서 문제를 푸는 것도 나쁘지 않아 보였다.
이 문제는 CLASS 2에 속한 문제로 알고리즘 분류는 무작위 대입, 브루트 포스 문제다.
1편이 666이기 때문에 666으로 초기화한 i를 계속 증가시켜가면서 6 세 개가 연속되는 숫자이면 편 수를 증가시키고, 편 수가 목표한 편 수와 동일해지면 반복을 중단하고 출력하도록 문제를 풀었다.
'Study (etc) > Problem Solving' 카테고리의 다른 글
[BOJ / C++] 7568번 : 덩치 (0) | 2022.09.04 |
---|---|
[BOJ / C++] 2231번 : 분해합 (0) | 2022.09.04 |
[BOJ / C++] 7562번 : 나이트의 이동 (0) | 2022.09.02 |
[BOJ / C++] 11055번 : 가장 큰 증가 부분 수열 (0) | 2022.09.02 |
[BOJ / C++] 2170번 : 선 긋기 (0) | 2022.09.01 |