코딩테스트 대비/BOJ
[Baekjoon/Python] 9019번: DSLR - 효과는 굉장했다!
bluetag_boy
2022. 3. 9. 03:30
반응형
9019번: DSLR
네 개의 명령어 D, S, L, R 을 이용하는 간단한 계산기가 있다. 이 계산기에는 레지스터가 하나 있는데, 이 레지스터에는 0 이상 10,000 미만의 십진수를 저장할 수 있다. 각 명령어는 이 레지스터에
www.acmicpc.net
알고리즘 분류
- 그래프 이론
- 그래프 탐색
- 너비 우선 탐색
SOLUTION
import sys
from collections import deque
def bfs(A, B):
queue = deque([[A, ""]]) # queue에 초기값 A와 커맨드가 입력될 빈문자열을 넣는다.
visited = [False] * 10000 # 범위는 10000까지, D,S,L,R 명령을 통해 나온 숫자들을 방문 처리 하기 위한 공간
visited[A] = True # queue 에 들어온 A 값은 방문처리 / 방문처리 된 공간은 다시 방문할시 지나감
while queue:
num, command = queue.popleft()
if num == B: # 명령어를 실행한 후의 num이 최종값 B와 같다면 실행된 명령어들을 반환함
return command
# D
if not visited[num * 2 % 10000]: # D 명령어를 실행한 후의 값이 아직 방문하지 않았을 때
visited[num * 2 % 10000] = True # 방문 처리
queue.append([num * 2 % 10000, command + "D"]) # D 명령어를 실행했으므로 바뀐 num값과 명령어 D을 queue에 삽입
# S
if not visited[(num - 1) % 10000]: # S 명령어를 실행한 후의 값이 아직 방문하지 않았을 때
visited[(num - 1) % 10000] = True # 방문 처리
queue.append([(num - 1) % 10000, command + "S"]) # S 명령어를 실행했으므로 바뀐 num값과 명령어 S을 queue에 삽입
# L
if not visited[num % 1000 * 10 + num // 1000]: # L 명령어를 실행한 후의 값이 아직 방문하지 않았을 때
visited[num % 1000 * 10 + num // 1000] = True # 방문 처리
queue.append([num % 1000 * 10 + num // 1000, command + "L"]) # L 명령어를 실행했으므로 바뀐 num값과 명령어 L을 queue에 삽입
# R
if not visited[num % 10 * 1000 + num // 10]: # R 명령어를 실행한 후의 값이 아직 방문하지 않았을 때
visited[num % 10 * 1000 + num // 10] = True # 방문 처리
queue.append([num % 10 * 1000 + num // 10, command + "R"]) # R 명령어를 실행했으므로 바뀐 num값과 명령어 R을 queue에 삽입
T = int(sys.stdin.readline())
for _ in range(T):
A, B = map(int,sys.stdin.readline().split())
print(bfs(A, B))