문제 바로가기
https://www.acmicpc.net/problem/1436
1436번: 영화감독 숌
666은 종말을 나타내는 수라고 한다. 따라서, 많은 블록버스터 영화에서는 666이 들어간 제목을 많이 사용한다. 영화감독 숌은 세상의 종말 이라는 시리즈 영화의 감독이다. 조지 루카스는 스타워
www.acmicpc.net
관련 알고리즘
- 브루트포스
정답 및 해설
정수 N을 입력받아 '666'이 포함되어 있는 숫자 중 N번째로 작은 수를 구하는 문제이다.
문제의 제한시간도 2초로 넉넉하게 주어졌고, N의 범위가 1~10000이기 때문에 브루트포스 알고리즘으로 해결하였다.
변수를 하나씩 늘려가면서 '666'이 포함되는지 여부를 체크하면서, 포함된다면 몇 번째인지 찾아 N번째 수가 나올 때까지 반복하여 정답을 찾는다.
C++
더보기
#include<iostream>
using namespace std;
int main(){
int N,num=0,i=665,j;
cin>>N;
while(num!=N){
j=++i;
while(j>=666){
if(j%1000==666){
num++;
break;
}
j/=10;
}
}
cout<<i;
}
Line | 해설 |
4 | int N : N번째로 작은 '666'이 포함된 정수를 구해야 함 int num : 현재 확인한 수가 '666'이 포함된 정수 중 몇 번째인지 나타냄 (0으로 초기화) int i,j : num을 계산하기 위한 임시변수 (i는 665로 초기화) |
5~6 | 정수 N을 입력받고 while 반복문으로 num과 N이 같아질 때 까지 반복한다. |
7~15 | j=++i; 문으로 i에 1을 더한다음 j에 대입한다. 처음 반복문으로 들어왔을 때 i=665 였기 때문에 j는 i에 1을 더한 666이 된다. |
8~14 | j>=666 을 만족하는 동안 while 문을 반복한다. if 조건문으로 j%1000==666, 즉 j의 마지막 세 자리수가 666일 경우 num을 1 증가하고 break문으로 while문의 반복을 종료한다. 이때 num변수는 현재 정수 j(=i)가 '666'이 포함되는 숫자 중 작은 순으로 몇번째인지 나타낸다. if 문이 거짓일 경우 j/=10으로 j의 마지막 한 자리수를 제외하고 다시 if문으로 돌아간다. 해당 구문을 통해 j를 한 자리씩 지워가면서 '666'이 포함되는지 확인한다. 정수 j가 j<666 이된다면 '666'이 등장할 수 없기 때문에 while 문을 종료하고 처음의 while 문으로 돌아간다. 그 후, 다시 j=++i; 구문을 통해 i에 1을 증가한 후 위 과정을 반복하여 num과 N이 같아질 때 까지 반복한다. |
16 | 위 반복문에서 num==N일 때 반복문을 종료하여 마지막 i가 '666'이 포함되는 num(=N)번째 정수이다. |
'Coding > BOJ' 카테고리의 다른 글
[BOJ 백준] 1676 - 팩토리얼 0의 개수 (C++) (1) | 2023.11.20 |
---|---|
[BOJ 백준] 1546 - 평균 (C++) (0) | 2023.11.19 |
[BOJ 백준] 1259 - 팰린드롬수 (C++) (0) | 2023.11.17 |
[BOJ 백준] 1181 - 단어 정렬 (C++) (0) | 2023.11.16 |
[BOJ 백준] 1018 - 체스판 다시 칠하기 (C++) (0) | 2023.11.16 |