
네 개의 명령어 D, S, L, R 을 이용하는 간단한 계산기가 있다. 이 계산기에는 레지스터가 하나 있는데, 이 레지스터에는 0 이상 10,000 미만의 십진수를 저장할 수 있다. 각 명령어는 이 레지스터에 저장된 n을 다음과 같이 변환한다. n의 네 자릿수를 d1, d2, d3, d4라고 하자(즉 n = ((d1 × 10 + d2) × 10 + d3) × 10 + d4라고 하자)
위에서 언급한 것처럼, L 과 R 명령어는 십진 자릿수를 가정하고 연산을 수행한다. 예를 들어서 n = 1234 라면 여기에 L 을 적용하면 2341 이 되고 R 을 적용하면 4123 이 된다.
여러분이 작성할 프로그램은 주어진 서로 다른 두 정수 A와 B(A ≠ B)에 대하여 A를 B로 바꾸는 최소한의 명령어를 생성하는 프로그램이다. 예를 들어서 A = 1234, B = 3412 라면 다음과 같이 두 개의 명령어를 적용하면 A를 B로 변환할 수 있다.
1234 →L 2341 →L 3412
1234 →R 4123 →R 3412
따라서 여러분의 프로그램은 이 경우에 LL 이나 RR 을 출력해야 한다.
n의 자릿수로 0 이 포함된 경우에 주의해야 한다. 예를 들어서 1000 에 L 을 적용하면 0001 이 되므로 결과는 1 이 된다. 그러나 R 을 적용하면 0100 이 되므로 결과는 100 이 된다.
프로그램 입력은 T 개의 테스트 케이스로 구성된다. 테스트 케이스 개수 T 는 입력의 첫 줄에 주어진다. 각 테스트 케이스로는 두 개의 정수 A와 B(A ≠ B)가 공백으로 분리되어 차례로 주어지는데 A는 레지스터의 초기 값을 나타내고 B는 최종 값을 나타낸다. A 와 B는 모두 0 이상 10,000 미만이다.
A에서 B로 변환하기 위해 필요한 최소한의 명령어 나열을 출력한다. 가능한 명령어 나열이 여러가지면, 아무거나 출력한다.
bfs 문제라고 생각했다. DSLR에 따라서 각각 함수를 만들고 A에서 B로 찾아가는 모든 숫자를 만들면서 가는데 시간초과와 메모리초과가 돌아가면서 발생하는..아리까리한 문제였다.L과 R을 구현하는 것일텐데 나도 처음에는 리스트 인덱싱을 통해 구현을 했지만 시간초과가 발생한다. mod 연산을 통해 구현을 해야만 한다. from collections import deque
import sys
def D(n):
if 2 * n > 9999:
return (2 * n) % 10000
else:
return 2 * n
def S(n):
if n > 0:
return n - 1
else:
return 9999
def L(n):
num1 = n % 1000
num2 = n // 1000
return 10 * num1 + num2
def R(n):
num1 = n // 10
num2 = n % 10
return 1000 * num2 + num1
def bfs(a, b):
q = deque([])
q.append((a, ''))
visited = [0] * 10000
visited[a] = 1
while q:
num, answer = q.popleft()
if num == b:
return answer
for ni, nj in [(D(num), 'D'), (S(num), 'S'), (L(num), 'L'), (R(num), 'R')]:
if 0 <= ni < 10000 and not visited[ni]:
q.append((ni, answer + nj))
visited[ni] = 1
T = int(input())
for _ in range(T):
a, b = map(int, sys.stdin.readline().split())
print(bfs(a, b))