본문 바로가기
백준 알고리즘(BOJ)

백준 알고리즘 1436 (영화감독 숌) - C++, Python

by Think_why 2019. 10. 16.

[문제] 백준 알고리즘 1436 (영화감독 숌)

https://www.acmicpc.net/problem/1436

 

1436번: 영화감독 숌

666은 종말을 나타내는 숫자라고 한다. 따라서, 많은 블록버스터 영화에서는 666이 들어간 제목을 많이 사용한다. 영화감독 숌은 세상의 종말 이라는 시리즈 영화의 감독이다. 조지 루카스는 스타워즈를 만들 때, 스타워즈 1, 스타워즈 2, 스타워즈 3, 스타워즈 4, 스타워즈 5, 스타워즈 6과 같이 이름을 지었고, 피터 잭슨은 반지의 제왕을 만들 때, 반지의 제왕 1, 반지의 제왕 2, 반지의 제왕 3과 같이 영화 제목을 지었다. 하지만 숌은 자신이 조

www.acmicpc.net

 

666부터 6이 연속으로 3번 나오는 N번째 수를 찾는 문제이다.

브루트 포스 문제이고, 떠오른 방법은 2가지이다.

 

1번 풀이 : 숫자 그대로 이용 (C++ 풀이)

1. 숫자 중간이든 끝이든 666이면 되니까, x % 1000을 했을 때 666인지 체크,

    오른쪽의 한 자리씩 없애가며 반복. ( x /= 10 )

2. 만족하는 x를 찾으면, N을 하나씩 줄이며 while문으로 N==0 이면 멈춘다.

 

2번 풀이 : 문자식으로 이용 (Python 풀이)

1. 666부터 str으로 for문을 돌려서 요소가 6이면 cnt += 1 해주고,

    연속 3개가 아니면 다시 cnt = 0

2. 만족하는 x를 찾으면, N을 하나씩 줄이며 while문으로 N==0 이면 멈춘다.

 

최대한 효율적이게 짰는데도, Python으로는 걸리는 시간이 무지막지하다.

Python은 1번 풀이, 2번 풀이로 어떻게 돌려도 둘 다 느리다......

Python3로는 C++보다 70배 이상, Pypy3로 해도 10배 느림.

 

[C++]

#include <cstdio>
using namespace std;

int solve(int n) {
	int out = 0, tmp_i = 0, i = 666;
	while (n != 0){
		bool flag = 0;
		tmp_i = i;
		while (tmp_i != 0) {
			int mod = 0;
			mod = tmp_i % 1000;
			tmp_i /= 10;
			if (mod == 666) {
				out = i;
				n--;
				break;
			}
		}
		i++;
	}
	return out;
}

int main() {
	int n = 0;
	scanf("%d", &n);
	printf("%d", solve(n));
}

 

[Python]

import sys
N = int(sys.stdin.readline())
num = 666
while N != 0:
    flag = False
    cnt = 0
    for i in str(num):
        if i == '6':
            cnt += 1
        elif cnt < 3:
            cnt = 0
    if cnt >= 3:
        out = num
        N -= 1
    num += 1
print(out)

 

728x90

댓글