키키의 개발일기 [Kiki's Dev Diary]

1436번: 영화감독 숌 (python) 본문

알고리즘/브루트 포스

1436번: 영화감독 숌 (python)

Yoozin 2023. 4. 21. 03:09

브루트포스 문제 가즈아

문제

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

 

예제 입력 

1666

예제 출력 

2

 

문제 요약

입력값 n이 주어졌을 때 666들어 간 숫자들 중 n번째로 작은 숫자를 구해라. (오 이렇게 간단한 문제를 저렇게 길게 쓰다니)

접근방법

1 -> 666,   2->1666,    3->2666,  ... , 6->5666 여기까지만 보고 뭐야 앞에다가 입력값 숫자 중 666 앞에 숫자에 1만 더하면 되는 거 아냐?라는 안일한 생각을 정말 잠깐 했습니다..^^

인생은 그리 쉽지 않은 것을 잠시 망각하다가 깨닫게 해 준 뒤의 예시들 187->66666,  500->166699

그래여 ,, 숫자는 앞에만 추가되는 게 아님니다..

 

그렇게 코드를 구현해 보았는데 처음에는 

n = int(input())
t = 0
k = 666
while t<=n:
    if '666' in str(k):
    	k=int(k)+1
        t=t+1
print(k)

 이렇게 구현해 보았다.

대충 while문을 t가 n보다 커지기 전까지 돌린 다음에 k안에 666이 들어있으면 t를 +1해 주는 방식을 생각해서 이렇게 해보았다.

음 그니깐 t는 t번째로 666이 들어가는 숫자가 되는 것이고 k는 숫자를 키우면서 666이 들어간 숫자를 찾는 변수인 것이다.

차피 666부터 필요하니까 0부터 안 하고 666을 초기값으로 넣어줬다.

 

쨌든 이렇게 구현했을 때 결과는 코드가 멈추질 않아요,, 그렇다,, k랑 t가 다 if 안에 있으니 if 조건이 true가 처음에 안 나오면 아무것도 진행되지 못한다..

깨달음을 얻은 뒤 k를 if문 밖으로 빼줬다.  k는 밖에 있어야 하는 게 맞다. 왜냐면 k는 if문 조건, 그니깐 k안에 666이 있지 않아도 계속 +1 시켜주면서 666이 들어가는 숫자가 있는지 확인해 줘야 하니,,

너무 당연한 소리지만 원래 첫 코드는 생각나는 대로 대충 써본 다음에 코드 돌려가면서 고쳐나가는 거 아니겠냐며 ~ 우리 처음부터 너무 완벽하게 생각하지 않기로 해요,, 뭐든 부딪혀보기..(?)

 

밖으로 빼줘도 정답이 안 나온다.

이유는 두 가지 

1. k를 666부터 시작하면 k가 +1이 되어서 667부터 시작하게 됨 -> k를 665로 변경

2. t가 0이면 안 됨 왜냐면 t는 666이 등장하는 번째를 알려주는데 666이 처음 등장할 때 0번째가 아니라 첫 번째여야 하니까,,

   -> t를 1로 바꿔주던가 아니면 while문을 n-1로 고치기

 

최종코드

n = int(input())
t = 1
k = 665
while t<=n:
    k=int(k)+1
    if '666' in str(k):
        t=t+1
print(k)

이렇게 해서 정답이 떴다.

아 그리고 k안에 666이 있는지 확인하기 위해서 k를 문자열로 바꿔줬다가 1 더하기 위해서는 int여야 하니까 int로 다시 바꿔주기를 하였다.

다음부터는 변수명 좀 신경 쓰자,,

 

메모리: 31256KB   시간: 1048ms

 

끝!

'알고리즘 > 브루트 포스' 카테고리의 다른 글

2798번: 블랙잭 (python)  (0) 2023.04.19
Comments