[백준 9019] DSLR ⏰
🥚문제링크
https://www.acmicpc.net/problem/9019
- 그래프 이론
- 그래프 탐색
- 너비 우선 탐색
🍳코드
PyPy3로 통과
import sys
input = sys.stdin.readline
def solve(A, B):
# (현재 A값, 지금까지 수행한 연산)을 q에 삽입
q = deque([(A, "")])
visited[A] = True
while q:
A, dslr = q.popleft()
if A == B:
print(dslr)
break
# D
new_A = A * 2 % 10000
if not visited[new_A]:
visited[new_A] = True
q.append((new_A, dslr + "D"))
# S
if A == 0:
new_A = 9999
else:
new_A = A - 1
if not visited[new_A]:
visited[new_A] = True
q.append((new_A, dslr + "S"))
# L
new_A = (A % 1000) * 10 + A // 1000
if not visited[new_A]:
visited[new_A] = True
q.append((new_A, dslr + "L"))
# R
new_A = (A % 10)*1000 + (A//10)
if not visited[new_A]:
visited[new_A] = True
q.append((new_A, dslr + "R"))
T = int(input().strip())
for _ in range(T):
# 연산 횟수를 줄이기 위해,
# A값이 i일 때 DSLR 연산을 시도해보았다면
# vsited[i] = True
visited = [False]*100000
A, B = map(int, input().split())
solve(A, B)
🧂아이디어
탐색, BFS
- 각 테스트케이스별로 A값이 i일 때, DSLR 연산을 시도해보았는지 체크하는 방문 리스트
visited
를 만든다. 이는 같은 수에 대해 연산을 반복하지 않기 위함이다.
- solve 함수는 BFS를 한다. 큐에
(현재 A값, 지금까지 수행한 연산 string)
을 삽입한다.
이후 큐에 담겨있던 A값에 대해 D, S, L, R 연산을 각각 수행한 뒤
방문한 적이 없다면 방문 표시를 하고, 큐에 (연산을 수행한 뒤의 A값, 연산 string+ 현재 수행한 연산)
을 삽입한다.
- (주의) L, R 연산 -> 다른 자료구조 (deque, list 등...)를 사용하는 방식이 아닌, 수식으로 해야 시간 내에 통과할 수 있다.
🧐
visited
를 만든다. 이는 같은 수에 대해 연산을 반복하지 않기 위함이다.(현재 A값, 지금까지 수행한 연산 string)
을 삽입한다.이후 큐에 담겨있던 A값에 대해 D, S, L, R 연산을 각각 수행한 뒤
방문한 적이 없다면 방문 표시를 하고, 큐에
(연산을 수행한 뒤의 A값, 연산 string+ 현재 수행한 연산)
을 삽입한다.- 가장 아래 두 개의 코드는 L, R 연산을 deque 자료구조의
rotate()
를 이용해서 진행했는데, 시간초과가 발생하여 수식으로 변경했다.
Author And Source
이 문제에 관하여([백준 9019] DSLR ⏰), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@eastgloss0330/백준-9019-DSLR저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)