반응형
문제 설명
입출력 예제
풀이 코드
A와 B는 모두 0 이상 10000이하의 수라고 했으므로 visited 배열의 수를 10000으로 초기화 해주었다.
그리고 방문하지 않은 수는 bfs 탐색을 시작한다.
여기서 핵심은 일반적인 bfs 문제의 dx, dy 상하좌우 이동 처럼 D, S, L, R 을 활용하는 것이다.
큰 난이도가 있는 문제는 아니라서 아래 코드와 주석을 참고하면 이해될 것이다.
참고로 테스트 케이스 반복문 때문인지 파이썬으로 제출하면 시간초과가 났고 PYPY3로 제출하니 통과할 수 있었다.
정답 코드
from collections import deque
import sys
input = sys.stdin.readline
def applyCommand(n, command):
if command == "D":
# D 는 n * 2. 결과 값이 9999 보다 큰 경우에는 10000 으로 나눈 나머지를 취한다
return (n * 2) % 10000
if command == "S":
# S 는 n-1. n이 0 이라면 9999 가 대신 레지스터에 저장된다.
return (n - 1) % 10000
if command == "L":
# L 은 n의 각 자릿수를 왼편으로 회전시켜 그 결과를 레지스터에 저장한다.
return (10 * n + (n // 1000)) % 10000
if command == "R":
# R 은 n의 각 자릿수를 오른편으로 회전시켜 그 결과를 레지스터에 저장한다.
return (((n % 10) * 1000) + (n // 10)) % 10000
def bfs(n):
q = deque()
q.append((n, ""))
visited[n] = True
while q:
n, result = q.popleft()
if n == b:
return result
for command in commands:
newNum = applyCommand(n, command)
if not visited[newNum]:
visited[newNum] = True
q.append((newNum, result + command))
t = int(input())
commands = ["D", "S", "L", "R"]
for _ in range(t):
a, b = map(int, input().split())
visited = [False] * 10000
print(bfs(a))
'◼ 코딩테스트 > DFS,BFS' 카테고리의 다른 글
[Python/파이썬] 백준 2589 - 보물섬 (1) | 2023.06.09 |
---|---|
[Python/파이썬] 백준 2636 - 치즈 (0) | 2023.06.08 |
[Python/파이썬] 백준 5014 - 스타트링크 (0) | 2023.06.06 |
[Python/파이썬] 백준 1697번 - 숨바꼭질 (0) | 2023.06.04 |
[Python/파이썬] 백준 16953 - A -> B (0) | 2023.06.03 |