


소수를 유난히도 좋아하는 창영이는 게임 아이디 비밀번호를 4자리 ‘소수’로 정해놓았다. 어느 날 창영이는 친한 친구와 대화를 나누었는데:
그렇다. 그래서 여러분이 이 문제를 풀게 되었다. 입력은 항상 네 자리 소수만(1000 이상) 주어진다고 가정하자. 주어진 두 소수 A에서 B로 바꾸는 과정에서도 항상 네 자리 소수임을 유지해야 하고, ‘네 자리 수’라 하였기 때문에 0039 와 같은 1000 미만의 비밀번호는 허용되지 않는다.
첫 줄에 test case의 수 T가 주어진다. 다음 T줄에 걸쳐 각 줄에 1쌍씩 네 자리 소수가 주어진다.
각 test case에 대해 두 소수 사이의 변환에 필요한 최소 회수를 출력한다. 불가능한 경우 Impossible을 출력한다.
이 문제는 다음과 같은 순서로 구현하였다.
prime 리스트에 bool 형으로 저장한다. (소수면 1, 아니면 0)cnt)를, bfs 함수가 끝났음에도 원하는 수를 찾지 못했다면 'Impossible'을 출력한다.import sys
from collections import deque
input = sys.stdin.readline
def seive_of_eratosthenes(n):
is_prime = [1 for _ in range(n + 1)]
for i in range(2, int(n**0.5) + 1):
if is_prime[i]:
for j in range(i**2, n + 1, i):
is_prime[j] = 0
return is_prime[:]
prime = seive_of_eratosthenes(10000)
def bfs(start):
q = deque()
q.append((start, 0))
while q:
num, cnt = q.popleft()
if num == b:
return cnt
num1 = num // 1000
num2 = num // 100 % 10
num3 = num // 10 % 10
num4 = num % 10
for i in range(10):
next1 = i * 1000 + num2 * 100 + num3 * 10 + num4
next2 = num1 * 1000 + i * 100 + num3 * 10 + num4
next3 = num1 * 1000 + num2 * 100 + i * 10 + num4
next4 = num1 * 1000 + num2 * 100 + num3 * 10 + i
if next1 > 999 and prime[next1] == 1 and visited[next1] == 0:
visited[next1] = 1
q.append((next1, cnt + 1))
if next2 > 999 and prime[next2] == 1 and visited[next2] == 0:
visited[next2] = 1
q.append((next2, cnt + 1))
if next3 > 999 and prime[next3] == 1 and visited[next3] == 0:
visited[next3] = 1
q.append((next3, cnt + 1))
if next4 > 999 and prime[next4] == 1 and visited[next4] == 0:
visited[next4] = 1
q.append((next4, cnt + 1))
return 'Impossible'
t = int(input())
for _ in range(t):
a, b = map(int, input().split())
visited = [0 for _ in range(10000)]
print(bfs(a))
오랜만에 쉬운 문제라서 가벼운 마음으로 풀었던 문제였다.
https://www.acmicpc.net/problem/1963