๋ฌธ์
๋ฐฑ์ค ์จ๋ผ์ธ ์ ์ง - 1963๋ฒ
ํ์ด ๊ณผ์
๋ชฉํ ์ง์ ์ ๋๋ฌํ๊ธฐ ์ํ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ฏ๋ก BFS
๋ฅผ ํตํด ๋ต์ ๊ตฌํ์ต๋๋ค.
์ฐ์ ํ์ฌ ์ซ์์์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์๋ฆฌ์๋ ์ด 4๊ฐ์ด๋ฏ๋ก ๊ฐ ์๋ฆฌ์์ 0~9์ ์ซ์๋ฅผ ํ๋์ฉ ๋ฃ์ด๋ณด๋ฉฐ
๊ทธ๋ก ์ธํด ์์ฑ๋ ์ซ์๊ฐ ์์์ผ ๊ฒฝ์ฐ ํ์ ๋ฃ์ด์คฌ์ต๋๋ค.
์ด๋ ์์์ธ์ง ํ๋ณํ๋ ์๊ณ ๋ฆฌ์ฆ์ O(root(N))
์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ฏ๋ก ์ฃผ์ด์ง ์ ํ ์๊ฐ๋ด์ ์ถฉ๋ถํ ์ํ ๊ฐ๋ฅํฉ๋๋ค.
์ฝ๋
import sys
from collections import deque
def is_prime(n):
if n <= 1:
return False
if n == 2:
return True
if n % 2 == 0:
return False
sqrtn = int(n**0.5)
for div in range(3, sqrtn+1, 2):
if n % div == 0:
return False
return True
def bfs(start, goal):
q = deque()
visit = [0 for _ in range(10000)]
q.append((start, 0))
visit[start] = 1
while q:
here, cost = q.popleft()
if here == goal:
return cost
temp = str(here)
for idx, digit in enumerate(temp):
for n in range(10):
if n != int(digit):
new = temp[:idx] + str(n) + temp[idx+1:]
if is_prime(int(new)) and not visit[int(new)]:
q.append((int(new), cost + 1))
visit[int(new)] = 1
return 'Impossible'
if __name__ == '__main__':
T = int(input())
for case in range(T):
frm, to = list(map(int, sys.stdin.readline().split()))
ret = bfs(frm, to)
print(ret)
๋ฐ์ํ
'๐ algorithm > boj' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
BOJ 16397 - ํ์ถ (0) | 2021.03.18 |
---|---|
BOJ 2563 - ์์ข ์ด (0) | 2021.03.18 |
BOJ 4195 - ์น๊ตฌ ๋คํธ์ํฌ (0) | 2021.03.18 |
BOJ 17626 - Four Squares (0) | 2021.03.18 |
BOJ 1303 - ์ ์ - ์ ํฌ (0) | 2021.03.18 |
๐ฌ ๋๊ธ