백준 1436 - 영화감독 숌

이승현·2022년 3월 13일
0

백준

목록 보기
2/20

문제

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번째 영화의 제목에 들어간 수를 출력한다.

Solution

Python

movie_input = int(input())
j = str(666)
count = 0
while True:
    if '666' in j:
        count = count+1
    if count == movie_input:
        print(j)
        break
    j = str(int(j) + 1)

파이썬에서 입력받는 값은 str로 처리된다. 무한루프를 돌 때 for문을 어떻게 사용해야 할지 좀 고민이였는데 while True를 통상적으로 사용하나보다. 처음에 시간초과 떠서 왜 뜨나 했는데 break를 안걸어서 무한루프를 돌아서 였나 보다. 1씩 더하지 않고 푸는 방법이 있을까?

C++

#include <iostream>
using namespace std;
int main() {
    int count = 0;
	int input;
	cin >> input;
	for (int i = 666;; i++) {
		int temp = i;
		while (temp >= 666) {
			if (temp % 1000 == 666) {
				count++;
				break;
			}
			temp /= 10;
		}
		if (count == input) {
			cout << i;
			break;
		}
	}
}

개인적으로 C++로 해결하려니 난이도가 있었다. string 처리하는 부분에선 정말 파이썬이 말도안되게 좋은 듯 하다 ... 문자열로 처리해서 3개 연속 6인 경우를 체크하려 해봤는데 , 자꾸 오류가 나서 정수형으로 처리하는 방법으로 바꿨다. 구글의 힘을 조금 빌렸다 ..

Java

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int count= 0;
		int input = scanner.nextInt();
		for(int i=666;;i++) {
			String movie_num = Integer.toString(i);
			if(movie_num.contains("666")) {
				count++;
			}
			if(count == input) {
				System.out.println(i);
				break;
			}
		}
	}

}

느낀점

파이썬, 자바가 확실히 코드 짜기는 쉽다. 파이썬은 for, in만 사용해도 바로 해결할 수 있고, 자바도 contains 함수를 사용하면 쉽게 해결할 수 있다. 근데 수행시간이 파이썬은 1292ms, 자바는 380ms, C++는 16ms로 C++이 말도 안되게 빠르다. 이래서 C++이 빠르다는 건가 ? 물론 C++는 int 형태로 해결했기 때문에 빠른걸테지만 .. string으로 해결할 방법이 떠오르지 않는다. 앞으론 파이썬이랑 자바도 수행시간을 빠르게 하는 방향으로 코드를 짜봐야 겠다.

profile
Programming Beginner

0개의 댓글

관련 채용 정보