DSLR 명령어를 이용하여 숫자 A
를 숫자 B
로 변환할 때, 나올 수 있는 최소 경로를 출력하는 문제.
이때 DSLR의 의미는 다음과 같다. 입력값으로 n
이 주어질 때,
D
: n
을 (2*n) % 10000
변환
S
: n
이 0이면 n
을 9999로 변환, n > 0
이면 n-1
로 변환
L
: n
의 4자리수를 d1, d2, d3, d4
라고 할 때, d2, d3, d4, d1
으로 변환
R
: n
의 4자리를 d1, d2, d3, d4
라고 할 때, d4, d1, d2, d3
으로 변환
주의할 점은 L
또는 R
명령어를 사용할 경우, n
을 항상 4자리수로 두고 명령을 수행해야한다. 예를 들어 n
이 5이고 L
명령어를 수행 한다고 해보자. n
을 4자리수로 만들면 0005
이고 여기서 L
을 실행하면 결과는 0050
이 되므로 50
이된다.
이번엔 R
명령어를 실행해보자 n
이 5일 때, R
명령어를 수행하면 n
은 5000
으로 변환된다.
L
,R
을 잘 이해하고 구현하는 것이 중요하다.
L
의 경우 백이하 자리수의 숫자들이 왼쪽으로 가고 천 자리 숫자가 일의 자리로 가는 사실 이용해 구현한다.
R
의 경우 일의 자리 숫자가 천의 자리로 이동하고, 천, 백, 십 자리의 숫자들이 오른쪽으로 가는 사실을 이용해 구현한다.
D
,S
,L
,R
을 구현한 후,BFS
를 이용하여 해결한다.
import sys
from collections import deque
cmd = {0:'D', 1:'S', 2:'L', 3:'R'}
def D(n):
return (n * 2) % 10000
def S(n):
if n == 0: return 9999
return n - 1
def L(n):
return (n % 1000) * 10 + n // 1000
def R(n):
return (n % 10) * 1000 + n // 10
def solve():
a, b = map(int, sys.stdin.readline().rstrip().split())
visited = [False for _ in range(10000)]
q = deque()
q.append([a, ''])
visited[a] = True
while q:
cn, path = q.popleft()
if cn == b:
print(path)
break
nns = [D(cn), S(cn), L(cn), R(cn)]
for i in range(4):
nn = nns[i]
if not visited[nn]:
visited[nn] = True
q.append([nn, path+cmd[i]])
tc = int(sys.stdin.readline().rstrip())
while tc:
solve()
tc -= 1