백준 9019번 DSLR

DARTZ·2022년 5월 6일
0

알고리즘

목록 보기
41/135

틀린 내 코드

import sys
from collections import deque

sys.stdin = open('input.txt', 'rt')
input = sys.stdin.readline

T = int(input())

for _ in range(T):
    A, B = map(int, input().split())
    queue = deque()
    answer = [0,0,0,0]
    queue.append([A, 'D'])
    queue.append([A, 'S'])
    queue.append([A, 'L'])
    queue.append([A, 'R'])

    def bfs():

        while queue:
            num, register = queue.popleft()
            if num == B:
                return register

            if register == 'D':
                d = num * 2

                if d > 9999:
                    d = d % 10000

                answer[0] += 1
                queue.append([d, 'D'])

            elif register == 'S':
                s = num - 1

                if num == 0:
                    s = 9999

                answer[1] += 1
                queue.append([s, 'S'])

            elif register == 'L':
                l = int(num % 1000 * 10 + num // 1000)
                answer[2] += 1
                queue.append([l, 'L'])

            elif register == 'R':
                r = int(num % 10 * 1000 + num // 10)
                answer[3] += 1
                queue.append([r, 'R'])

    response = bfs()

    if response == 'D':
        print('D' * answer[0])

    elif response == 'S':
        print('S' * answer[1])

    elif response == 'L':
        print('L' * answer[2])

    elif response == 'R':
        print('R' * answer[3])

나름 열심히 머리를 굴려서 풀었는데 로컬에서는 성공인데 백준에서는 실패가 뜬다.. 내가 생각치 못한 부분이 있었겠지..

정답 코드

from collections import deque
import sys
input = sys.stdin.readline

for _ in range(int(input())):
    A,B = map(int,input().split())
    q = deque()
    q.append((A,""))
    visit = [False] * 10000 # 값 저장
    
    while q:
        num, path = q.popleft()
        visit[num] = True
        if num == B: # 결과가 만들어 졌을 때 종료
            print(path)
            break
        
        # 1번 조건 D
        num2 = (2*num)%10000
        if not visit[num2]:
            q.append((num2,path+"D"))
            visit[num2] = True
        # 2번 조건 S
        num2 = (num-1)%10000
        if not visit[num2]:
            q.append((num2,path+"S"))
            visit[num2] = True
        # 3번 조건 L
        num2 = (10*num+(num//1000))%10000
        if not visit[num2]:
            q.append((num2,path+"L"))
            visit[num2] = True
            
        # 4번 조건 R
        num2 = (num//10+(num%10)*1000)%10000
        if not visit[num2]:
            q.append((num2,path+"R"))
            visit[num2] = True

맙소사.. 한가지의 레지스터가 아니라 조합해서 답을 구하는 것이었다.
visited * 10000 리스트를 만들어서 방문을 체크한다. 어느 레지스터든 그 숫자가 나왔으면 방문처리를 해주고 path경로에 더해준다.

profile
사람들이 비용을 지불하고 사용할 만큼 가치를 주는 서비스를 만들고 싶습니다.

0개의 댓글