https://www.acmicpc.net/problem/14382
22/09/25
단순한 시뮬레이션 문제로, 엄밀한 증명은 하지 않았으나 누구나 쉽게 떠올릴 법한 풀이로 해결한 문제이다.
문제 접근 방식:
먼저 문제에서 주어진 것처럼 계속 숫자를 키워나가며 수를 기록해갔다. 근데, INSOMNIA를 어떻게 판단하느냐가 관건이였다.
영원히 잠에 들지 못하면 INSOMNIA를 출력한다고 했는데, 반복문으로는 영원히 루프를 돌다간 시간 초과가 날 것이 분명하기 때문이다.
이러한 이유로, 나는 분명히 이 문제를 해결하기 위해선 일정 횟수 이상을 반복하여 수를 곱하는데도 안 나온다면 중간에 멈춰줘야 된다고 생각했다.
나는 그 숫자를 100으로 잡았는데, 나름대로의 합리화를 진행했다.
어떤 숫자가 있으면, 그 숫자에 10을 곱한 것은 사실 그 숫자 뒤에 0을 붙인 것과 다름이 없다.
마찬가지로, 어떤 숫자에 20을 곱한 것은 사실 그 숫자의 두 배에 0을 붙인 것과 다름이 없다.
이러한 사실로 인해, 어떠한 숫자든지 간에, 배수가 되면 특정 숫자들만 반복해서 나오게 될 것이라고 생각했다.(실제로 엄밀하게 증명하지는 못했다.)
이러한 믿음을 가지고 100의 배수까지 돌려가며 시뮬레이션을 진행하였고, 이렇게까지 했음에도 불구하고 나오지 않았다면 이는 불가능한 것으로 간주하여 INSOMNIA를 출력하도록 구현하였다.
아래는 내가 위의 접근 방식과 같이 작성한 파이썬 코드이다. 더보기를 누르면 확인할 수 있다.
# 14382번 숫자세는 양 (Large)
# 수학, 시뮬레이션, 구현
import sys
input = sys.stdin.readline
def simulation(num):
number_set = set()
i = 1
while True:
if i > 100:
break
number_set = number_set | set(str(num*i))
if len(number_set) == 10:
return str(num*i)
i += 1
return 'INSOMNIA'
T = int(input())
for test_case_num in range(1, T+1):
N = int(input())
print(f'Case #{test_case_num}: {simulation(N)}')
'알고리즘 > 백준 문제 풀이' 카테고리의 다른 글
[Python] 21919번 소수 최소 공배수 (0) | 2022.10.21 |
---|---|
[Python] 9918번 Cube / 2642번 전개도 (0) | 2022.10.21 |
[Python] 23629번 이 얼마나 끔찍하고 무시무시한 수식이니 (0) | 2022.10.20 |
[Python] 4349번 Blocks (0) | 2022.10.20 |
[Python] 1455번 뒤집기 II (0) | 2022.10.20 |