본문 바로가기

코딩/백준 BOJ

[백준/C언어] 1436번 - 영화감독 숌

백준 웹사이트 "1436번 - 영화감독 숌" 문제풀이입니다.

언어는 C언어입니다. (제출 언어: C99)

 


문제

 

1436번: 영화감독 숌

666은 종말을 나타내는 숫자라고 한다. 따라서, 많은 블록버스터 영화에서는 666이 들어간 제목을 많이 사용한다. 영화감독 숌은 세상의 종말 이라는 시리즈 영화의 감독이다. 조지 루카스는 스타

www.acmicpc.net


소스 코드

#include <stdio.h>

int main(void){
    int N;
    scanf("%d", &N);

    int count=0; // 종말의 숫자 개수
    int num=666; // 현재 숫자 (666부터 시작해도 무관)
    while(1){
        // num에 666이 포함된다면 count++
        int consecutive_6=0;
        int cur=num;
        while(cur>0){
            int digit = cur%10;
            if(digit==6)
                consecutive_6++;
            else
                consecutive_6=0; //다시 0으로 초기화
            
            if(consecutive_6==3){
                count++;
                break;
            }
            cur = cur/10;
        }

        // N번째로 작은 종말 숫자였다면 break, 아니라면 계속
        if(count==N)
            break;
        num++;
    }
    printf("%d\n", num);
}

문제 풀이

  '브루트 포스'라는 이름답게, 무식한 힘으로 문제를 해결해봅시다. 666이 포함되는 N번째 숫자를 구하는 가장 무식한 방법은, 666부터 숫자를 하나씩 직접 확인해보는 것입니다. Line 9의 while문은 무한 루프로, Line 28 if문의 조건문 'count==N'이 만족되어야만 종료됩니다. 여기서 count는 발견되는 종말의 숫자 개수이므로, 종말의 숫자를 N개 발견할 때까지 while문이 반복되겠죠? while문이 반복될 때마다 num이 1씩 증가하는데, while문이 종료되면 그 시점의 num이 N번째 종말의 숫자라는 뜻이 되므로, 이를 Line 32에서 출력합니다.

  Line 11 ~ 25에 들어가야 할 것은 'num에 666이 포함되는지 확인하고, 만약 포함된다면 count를 증가시키는 코드'입니다. 이를 위해 새로운 변수 consecutive_6과 cur을 선언/초기화해주는데, consecutive_6은 연속된 6의 개수를 기록하고, cur은 밑의 digit과 함께 각 자릿수를 하나씩 검사하는데 쓰입니다. 코드가 뜻하는 바는 간단합니다. 각 자릿수를 하나씩 검사하며 연속된 6의 개수를 기록하고, 그 개수가 3이 되면 count를 증가시키고 검사를 종료합니다. 이렇게 666부터 모든 숫자들을 하나씩 검사하다보면, 결국 N번째 종말의 숫자를 구할 수 있습니다.

반응형