728x90

문제

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

 

9019번: DSLR

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

www.acmicpc.net

 

풀이

BFS(너비 우선 탐색)를 사용해 풀었습니다.

큐에 (현재 숫자, 명령어)를 저장합니다.

시간 초과가 발생하지 않게 check를 사용해 이전에 이미 확인한 숫자면 다시 확인하지 않도록 합니다.

※ 처음에 L, R 연산을 큐를 사용해 이동시켰더니 시간 초과가 발생하여 단순 계산으로 바꿨더니 해결되었습니다.

 

코드

파이썬
from collections import deque
import sys

input = sys.stdin.readline


def BFS():
    queue = deque()
    check = [False] * 10000
    check[A] = True
    queue.append((A, ""))
    while queue:
        n, pro = queue.popleft()

        if n == B:
            return pro
        
        # D
        nn = n * 2
        if nn > 9999:
            nn %= 10000
        if not check[nn]:
            check[nn] = True
            queue.append((nn, pro + "D"))

        # S
        nn = n - 1
        if nn < 0:
            nn = 9999
        if not check[nn]:
            check[nn] = True
            queue.append((nn, pro + "S"))

        # L
        nn = ((n % 1000) * 10) + (n // 1000)
        if not check[nn]:
            check[nn] = True
            queue.append((nn, pro + "L"))

        # R
        nn = ((n % 10) * 1000) + (n // 10)
        if not check[nn]:
            check[nn] = True
            queue.append((nn, pro + "R"))


T = int(input())
for _ in range(T):
    A, B = map(int, input().split())
    print(BFS())
728x90

'🚩 코딩테스트 > 알고리즘' 카테고리의 다른 글

[백준] 1806번: 부분합  (0) 2023.05.08
[프로그래머스] 크레인 인형뽑기 게임  (0) 2023.03.16
[백준] 13549번: 숨바꼭질 3  (0) 2023.03.08
[백준] 1525번: 퍼즐  (0) 2023.03.04
[백준] 2251번: 물통  (0) 2023.03.04
딩딩크롱