[BaekJoon] λ°±μ€€ 9019번 : DSLR

Updated:

9019번 : DSLR

DLSR


[BaekJoon] λ°±μ€€ 1697번 : μˆ¨λ°”κΌ­μ§ˆ μ΄λž‘ λΉ„μŠ·ν•œ 문제..

μˆ¨λ°”κΌ­μ§ˆ 문제λ₯Ό ν’€λ•ŒλŠ” 미리 κ·Έλž˜ν”„λ₯Ό λ‹€ κ·Έλ € 놓고 탐색을 ν–ˆλŠ”λ° 이 문제λ₯Ό ν’€λ©΄μ„œ λŠκΌˆμ§€λ§Œ 그럴 ν•„μš”κ°€ μ—†μ—ˆλ‹€ !!

D, S, L, R 의 연산을 톡해 λ‚˜μ˜¨ κ²°κ³Όλ₯Ό 큐에 λ„£μ–΄κ°€λ©° BFS λ₯Ό ν•˜λ©΄ λœλ‹€..

그런데 μ²˜μŒμ— L, R 연산을 잘λͺ» μ΄ν•΄ν•˜κ³  μžˆμ–΄ μ—„μ²­ μ• λ₯Ό λ¨Ήμ—ˆλ‹€.

1 에닀가 L 연산을 μ·¨ν•˜λ©΄ 1이 λ˜λŠ”κ²Œ μ•„λ‹ˆλΌ 10 이 되고

1 에닀가 R 연산을 μ·¨ν•˜λ©΄ 1이 λ˜λŠ”κ²Œ μ•„λ‹ˆλΌ 1000 이 λœλ‹€.

0001 이라고 μƒκ°ν•˜κ³  연산을 ν–ˆμ–΄μ•Ό ν–ˆλ‹€.. κ·ΈλŸ°μ€„λ„ λͺ¨λ₯΄κ³  λ‹¨μˆœνžˆ κ·Έ 숫자둜만 ν•˜λŠ” 쀄 μ•Œκ³  μžˆμ—ˆλ‹€.

L, R 연산은 쑰금 생각해보면 μˆ˜μ‹μœΌλ‘œ λ§Œλ“€ 수 μžˆλ‹€

λ§Œμ•½ 4758 을 L μ—°μ‚° ν•˜κ³  μ‹Άλ‹€λ©΄ 7580 + 4 둜 λ§Œλ“€λ©΄ 되기 λ•Œλ¬Έμ— 4758 % 1000 * 10 + 4758 % 1000 을 ν•˜λ©΄ λœλ‹€.

μ΄λ ‡κ²Œ ν–ˆλŠ”λ° μ‹œκ°„μ΄ˆκ³Όκ°€ λ°œμƒν•΄ pypy3 으둜 제좜 ν•΄ ν†΅κ³Όν–ˆλ‹€.


import sys
from collections import deque


def find_min_route(a, b):

	visit = dict()
	start, end = a, b
	queue = deque([[start, '']])
	visit[start] = 1

	while queue:
		cur_node, cur_cal = queue.popleft()
		visit[cur_node] = 1
		D_i, S_i, L_i, R_i = D(cur_node), S(cur_node), L(cur_node), R(cur_node)

		if D_i not in visit:
			if D_i == end:
				return cur_cal + 'D'
			visit[D_i] = 1
			queue.append([D_i, cur_cal + 'D'])

		if S_i not in visit:
			if S_i == end:
				return cur_cal + 'S'
			visit[S_i] = 1
			queue.append([S_i, cur_cal + 'S'])

		if L_i not in visit:
			if L_i == end:
				return cur_cal + 'L'
			visit[L_i] = 1
			queue.append([L_i, cur_cal + 'L'])

		if R_i not in visit:
			if R_i == end:
				return cur_cal + 'R'
			visit[R_i] = 1
			queue.append([R_i, cur_cal + 'R'])


def D(a):
	return a * 2 % 10000


def S(a):
	return a - 1 if a != 0 else 9999


def L(a):
	return a % 1000 * 10 + a // 1000


def R(a):
	return a % 10 * 1000 + a // 10


for _ in range(int(input())):
	my_a, my_b = map(int, sys.stdin.readline().rsplit())
	print(find_min_route(my_a, my_b))



Categories:

Updated:

Leave a comment