[BOJ] 9019 : DSLR
💡 코드
from collections import deque
def cal_D(n):
return (n * 2) % 10000
def cal_S(n):
return n - 1 if n > 0 else 9999
def cal_L(n):
d1 = n // 1000
return n % 1000 * 10 + d1
def cal_R(n):
d4 = n % 10
return 1000 * d4 + n // 10
def check(n):
if visited[n]:
return False
return True
def bfs():
A, B = map(int, input().split())
# A -> B 가 되어야 함
q = deque([(A, "")])
visited[A] = 1
while len(q):
num, operate = q.popleft()
if num == B:
return operate
num_d = cal_D(num)
num_s = cal_S(num)
num_l = cal_L(num)
num_r = cal_R(num)
if check(num_d):
q.append((num_d, operate + 'D'))
visited[num_d] = 1
if check(num_s):
q.append((num_s, operate + 'S'))
visited[num_s] = 1
if check(num_l):
q.append((num_l, operate + 'L'))
visited[num_l] = 1
if check(num_r):
q.append((num_r, operate + 'R'))
visited[num_r] = 1
return ""
# T 번 수행
T = int(input())
for _ in range(T):
visited = [0 for _ in range(10000)]
print(bfs())
💡 풀이과정
어려운 건 없었다. 전형적인 쉬운 BFS 였고, visited를 큐에 넣고 바로 처리해줌으로써 조금이라도 시간을 줄일 수 있었다. 로직은 다음과 같다.
- B와 숫자가 같아졌는지 확인해서 같으면 현재까지의 연산을 출력한다.
- DSLR 연산을 각각 수행한 다음 조건에 맞으면 큐에 넣는다.
Author And Source
이 문제에 관하여([BOJ] 9019 : DSLR), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@devohda/BOJ-9019DSLR저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)