알고리즘/Python

[백준] 9019 - DSLR

9__bin 2023. 7. 19. 20:52

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

 

9019번: DSLR

네 개의 명령어 D, S, L, R 을 이용하는 간단한 계산기가 있다. 이 계산기에는 레지스터가 하나 있는데, 이 레지스터에는 0 이상 10,000 미만의 십진수를 저장할 수 있다. 각 명령어는 이 레지스터에

www.acmicpc.net

문제 한줄 이해

-D S L R의 각 명령어를 수행해 A 숫자가 B가 되기 위해 필요한 최소한의 명령어 구하기

 

생각난 풀이

1번째 방법: 각각의 명령어를 수행해 큐에 담아서 탐색하는 BFS가 떠올랐고 이미 방문한 숫자에 대해 다시 탐색하지 않게 visited처리를 해주었다. 이때 123에 R명령어를 수행하면 312가 되는것이 아니고 3012가 되는 점을 유의하기!

import sys
from collections import deque
t = int(sys.stdin.readline())

for i in range(t):
    visited = [False] * 10000
    a, b = map(int,sys.stdin.readline().split())
    
    que = deque()
    que.append((a,""))
    visited[a] = True
    while que:
        nowx, nowc = que.popleft()
        if nowx == b:
            print(nowc)
            break
        for k in ("D","S","L","R"):
            if k == "D":
                nextn = nowx*2 % 10000
                if visited[nextn] == False:
                    visited[nextn] = True
                    que.append((nextn,nowc+"D"))
            if k == "S":
                if nowx == 0:
                    nextn = 9999
                else:
                    nextn = nowx-1
                if visited[nextn] == False:
                    visited[nextn] = True
                    
                    que.append((nextn,nowc+"S"))
            if k == "L":
                nextn = nowx // 1000 + (nowx % 1000)*10
                if visited[nextn] == False:
                    visited[nextn] = True
                    que.append((nextn,nowc+"L"))
            if k == "R":
                nextn = nowx // 10 + (nowx % 10) * 1000
                if visited[nextn] == False:
                    visited[nextn] = True
                    que.append((nextn,nowc+"R"))

'알고리즘 > Python' 카테고리의 다른 글

[백준] 15652 - N과 M  (0) 2023.07.21
[백준] 14500 - 테트로미노  (0) 2023.07.20
[백준] 10026 - 적록색약  (0) 2023.07.13
[백준] 7569 - 토마토  (0) 2023.07.12
[백준] 1107 - 리모컨  (0) 2023.07.08