-
9019. [Python]DSLRPython_알고리즘/Gold IV 2023. 10. 8. 01:55
1. 문제
https://www.acmicpc.net/problem/9019
9019번: DSLR
네 개의 명령어 D, S, L, R 을 이용하는 간단한 계산기가 있다. 이 계산기에는 레지스터가 하나 있는데, 이 레지스터에는 0 이상 10,000 미만의 십진수를 저장할 수 있다. 각 명령어는 이 레지스터에
www.acmicpc.net
2. 접근 방법
- 시간 제한: 6초
- 메모리 제한: 256MB
- BFS(너비 우선 탐색)
3. 파이썬 코드
from collections import deque import sys input = sys.stdin.readline # 2배 해주는 함수 def Double(num): return (num * 2) % 10000 # -1 해주는 함수 def Subtrack(num): return (num - 1) if num > 0 else 9999 # 너비우선탐색 def BFS(start, target): # 방문처리 체크 visited = [False] * 10000 # queue 에 값과 어떤 결과를 시행했는지 자정 queue = deque([(start, "")]) # 시작값 방문처리 visited[start] = True # queue가 존재할 경우 계속 반복 while queue: current, path = queue.popleft() # 2배 한 함수와 -1 한 함수 시행한 결과값 변수에 저장 dobule_num = Double(current) subtrack_num = Subtrack(current) # left 로 움직이는 방법과 right로 움직이는 방법 변수에 저장 left_num = (current % 1000) * 10 + (current // 1000) right_num = (current % 10) * 1000 + (current // 10) # 목표값과 같으면 현재 path + 각 연산을 결과를 출력 if dobule_num == target: print(path + "D") return elif subtrack_num == target: print(path + "S") return elif left_num == target: print(path + "L") return elif right_num == target: print(path + "R") return # 저장된 숫자를 방문하지 않았을 경우 저장된 숫자 + 연산자를 queue에 추가해줌 if not visited[dobule_num]: visited[dobule_num] = True queue.append((dobule_num, path + "D")) if not visited[subtrack_num]: visited[subtrack_num] = True queue.append((subtrack_num, path + "S")) if not visited[left_num]: visited[left_num] = True queue.append((left_num, path + "L")) if not visited[right_num]: visited[right_num] = True queue.append((right_num, path + "R")) N = int(input()) for _ in range(N): problem, answer = map(int, input().split()) BFS(problem, answer)
4. 문제를 풀고난 후 생각
- start, end 값이 주어져있으면 start를 통해서 2배, -1, 왼쪽이동, 오른쪽 이동한 값들을 각각 deque에 넣어서 찾아내는 방식으로 풀어야한다.
- 방문 처리를 통해서 queue에 리스트에 넣을지 넣지 않을지 체크한 후 방문하지 않았으면 queue에 현재 값과 값이 연산된 순서를 같이 넣어준 후 방문처리를 True 한다.
- BFS로 한 숫자에 대한 연산을 다 시행해가며 값을 찾아내고 종료시킨다.
5. 문제를 푸는데 도움이 되는 지식
- BFS(너비 우선 탐색)
'Python_알고리즘 > Gold IV' 카테고리의 다른 글
1253. [Python] 좋다 (1) 2024.03.13 1261. [Python]알고스팟 (1) 2024.03.06 1753. [Python]최단경로 (0) 2024.03.03 17425. [Python]약수의 합 (1) 2023.10.09 10942. [Python]팰린드롬? (1) 2023.10.07