몽상실현개발주의

[BOJ] 1963 / 소수 경로 / Python 파이썬 본문

Algorithm PS/BOJ

[BOJ] 1963 / 소수 경로 / Python 파이썬

migrationArc 2021. 7. 25. 18:31

[BOJ] 1963 / 소수 경로 / Python 파이썬

[BOJ] 1963 / 소수 경로 / Python 파이썬

https://www.acmicpc.net/problem/1963

 

1963번: 소수 경로

소수를 유난히도 좋아하는 창영이는 게임 아이디 비밀번호를 4자리 ‘소수’로 정해놓았다. 어느 날 창영이는 친한 친구와 대화를 나누었는데: “이제 슬슬 비번 바꿀 때도 됐잖아” “응 지금

www.acmicpc.net

 

풀이

[BOJ] 1963 / 숨바꼭질 문제와 유사한 문제였다.

BFS 로 완전탐색을 하면서 memoization 으로 중복 탐색하는 경우를 제거하여 풀이하였다.

 

소수 판단은 "에라토스테네스의 체" 로 미리 만들어 주었고,

새롭게 생성되는 비밀번호는 자리수별로 0~9까지 변경하여 만들어 주었다.

 

 

from collections import deque

# 에라토스테네스의 체
def makePrime():
    nums = [1] * 10000
    nums[0] = 0
    nums[1] = 0

    for i in range(2, 10000):
        if nums[i]:
            for j in range(i, 10000, i):
                if i == j:
                    continue
                nums[j] = 0
    return nums


primes = makePrime()
case = int(input())

for _ in range(case):
    A, B = map(int, input().split())
    if A == B:
        print(0)
        continue
    if A > B:
        A, B = B, A

    queue = deque()
    queue.append(A)

    check = [0] * 10000
    check[A] = 1

    while True:
        Q = queue.popleft()

        if Q == B:
            print(check[Q]-1)
            break
		
        # 자리수
        for i in range(4):
        	# 변경 숫자 0~9
            for j in range(10):
                if i == 0 and j == 0:
                    continue
                nextQ = list(str(Q))
                nextQ[i] = str(j)
                nextQ = int("".join(nextQ))
				
                # 가능한 비밀번호 조건
                if primes[nextQ] and not check[nextQ]:
                    check[nextQ] = check[Q] + 1
                    queue.append(nextQ)

 

Comments