문제 보기: https://www.acmicpc.net/problem/1436
문제
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번째 영화의 제목에 들어간 수를 출력한다.
풀이 과정
코드1
숫자를 하나씩 올리면서 그 문자열에 666이 들어가 있는지를 확인 count를 올려주고 내가 입력한 몇 번째 숫자의 값과 같으면 해당 값을 프린트
코드 2
처음 이문제를 접했을 때는 아주 간단한 문제라고 생각했다 666이라는 숫자 앞에 스트링으로 계속 증가하는 값을 붙여주면 된다고 생각했기 때문이다.
하지만 밑의 예제 입력에 따른 예제 출력을 보면서 이 생각이 잘못되었다는 생각을 하게 되었다.
666 앞쪽에 숫자를 붙일 수 있는 방법과 뒤쪽에도 붙일 수 있다는 생각을 했기 때문이다.
이를 이용해서 처음 생각은 왼쪽 오른쪽에 들어가는 숫자에 대한 변수를 만들고 앞쪽 숫자 5까지 증가 오른쪽 5까지 증가 6일 때는 Left와 Right를 같이 증가 이후 왼쪽을 9까지 증가 오른쪽을 9까지 증가하려고 하면서 케이스에 따른 핸들링을 하려고 했는데 이는 10이 넘어가고 100이 넘어감에 따라 케이스를 계속 정해줘야 하기에 적합하지 않다고 생각하였다.
이에 왼쪽과 오른쪽에 숫자를 증가하고 오른쪽과 왼쪽을 비교하면서 작은 수를 사용하는 방식으로 코드를 구현해야겠다고 생각하고 구현하게 되었다. 하지만 몇몇 숫자를 탐색하지 못해서 실패
코드
코드 1
N = int(input())
num = 666
count = 1
while 1:
if N == 1:
break
num += 1
temp = str(num)
if '666' in temp:
count += 1
if count == N:
break
print(num)
코드 2
# 1436
left = 0
right = -1
n = 1
version = 666
right_version = version
count = -1
count += int(input())
for add in range(int(count)):
print(add)
if left >= 10 and left % (10 ** n) == 0:
temp = version
for i in range(n):
temp = str(temp) + "0"
print(f"temp:{temp}")
right_version = temp
right = -1
n += 1
if count == 0:
print(version)
elif int(str(left + 1) + str(version)) < int(str(right_version) + str(right + 1)):
left += 1
print(str(left) + str(version))
elif int(str(left + 1) + str(version)) > int(str(right_version) + str(right + 1)):
right += 1
print(str(right_version) + str(right))
if right == 9:
right_version = version
elif int(str(left + 1) + str(version)) == int(str(right_version) + str(right + 1)):
left += 1
right += 1
print(str(right_version) + str(right))
'Algorithm' 카테고리의 다른 글
[백준_1037] 약수 (0) | 2022.04.25 |
---|---|
[백준_2609] 최대공약수와 최소공배수 (0) | 2022.04.25 |
[백준_2869] 달팽이는 올라가고 싶다 (0) | 2022.04.25 |
[백준_1011] Fly me to the Alpha Centauri (0) | 2022.04.22 |
[백준_4948] 베르트랑 공준 (0) | 2022.04.22 |