T
: 테스트케이스 수
A
: 레지스터 초기 값 ()
B
: 레지스터 최종 값 ()
4가지의 계산을 통해 A를 B로 변환하는데 필요한 최소한의 명령어 나열을 출력하는 문제이다.
⌨️ 명령어 정리
n
= 저장된 숫자- D
n
2배- 결과가 9999보다 크다면 10000으로 나눈 나머지 값 저장
2n mod 10000
- S
n
에서 1 빼기n == 0
이라면
- 9999가 대신 저장
- L
- 각 자릿수 왼편으로 회전
- d1, d2, d3, d4 → d2, d3, d4, d1
- 천의 자리의 숫자를 구하고 나머지 자리들은 10만 곱해서 더해준다.
- R
- 각 자릿수 오른편으로 회전
- d1, d2, d3, d4 → d4, d1, d2, d3
- 일의 자리수에 1000을 곱해주고 나머지 자리는 10을 나눠서 더해준다.
- ⚠️ 주의
n
이 네자리 수가 아닐 경우- L, R 구하는 수식에서 이 부분이 커버 가능하다.
위의 명령어를 수행하면서 최소한의 명령어를 생성하는 경우를 찾는다.
→ BFS를 활용한다!!
BFS
bfs 수행 →
최종 시간복잡도
로,최악의 경우 이 되어 제한 시간 6초 내에 연산이 가능하다.
4가지 계산 방법에 대해 BFS 수행
queue = deque((A, ""))
로 괄호를 빼먹어서 발생한 문제였다.[]
로 묶어주어야 한다.n = 0
인 경우를 고려해주어야 하는데 빼먹었다. # S 계산
if n > 0:
S = n - 1
else:
S = 9999
if not visited[S]:
if S <= 0: # 0이면 9999로 변경
S = 9999
visited[S] = True
queue.append((S, command + "S"))
import sys
from collections import deque
input = sys.stdin.readline
# 테스트케이스 입력
T = int(input())
# 테스트케이스만큼 반복
for _ in range(T):
# A, B 입력
A, B = map(int, input().split())
# 방문리스트 정의
visited = [False for i in range(10001)]
# 큐 정의
queue = deque([(A, "")])
# 방문 처리
visited[A] = True
# 큐가 빌 때까지 반복
while queue:
n, command = queue.popleft()
# B가 됐는지 확인
if n == B:
print(command)
break
# D 계산
D = (n * 2) % 10000
if not visited[D]:
visited[D] = True
queue.append((D, command + "D"))
# S 계산
if n > 0:
S = n - 1
else:
S = 9999
if not visited[S]:
visited[S] = True
queue.append((S, command + "S"))
# L 계산
L = n // 1000 + (n % 1000) * 10
if not visited[L]:
visited[L] = True
queue.append((L, command + "L"))
# R 계산
R = (n % 10) * 1000 + n // 10
if not visited[R]:
visited[R] = True
queue.append((R, command + "R"))