๐ญ ๋ฌธ์ ๊ฐ ๊ถ๊ธํ๋ค๋ฉด?
๋ด๊ฐ ์๋ํ ๋ฐฉ๋ฒ
A
์์ B
๋ก ๋ณํํ๊ธฐ ์ํด ํ์ํ ์ต์ํ์ ๋ช
๋ น์ด' => BFS
๊ฐ ๋ ์ฌ๋๋ค.B
์ ๋๋ฌํ๋์ง ์ด๋ป๊ฒ ์ ์ฅํ ์ง ๊ณ ๋ฏผ์ ํ๋ ๊ฒฐ๊ณผ,visited
์ ์ง๋์จ ๊ฒฝ๋ก๋ฅผ ๋ด์์ ์ ์ฅํ๋ ๋ฐฉ์์ ํด๋ณด์๋ ๊ฒฐ๋ก ์ ๋๋ฌํ๋ค!DSLR
ํจ์ : ๋ช
๋ น์ด D
์ S
์ ๊ฒฝ์ฐ n
์ ๋ฒ์์์ ๋ฒ์ด๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํด์ ์ถ๊ฐ์ ์ธ ์์
์ด ํ์ํ๋๋ฐ, ์ต๋ํ ๊ทธ๋ฐ ์กฐ๊ฑด์ ๋ฐ๋ก ๋ถ๊ธฐ์ฒ๋ฆฌํ์ง ์๋ ๋ฐฉ๋ฒ์ ๋ ์ฌ๋ฆฌ๊ณ ์ถ์๋ค.def DSLR(num):
word = f'{num:04d}' # word: L, R ์์
์ ์ํ num์ 4์๋ฆฌ string์ผ๋ก ๋ณํ
result = {
'D': (num * 2) % 10000,
'S': num + 9999 - bool(num) * 10000,
'L': int(word[1:] + word[0]),
'R': int(word[-1] + word[:3])
}
return result
def bfs(start, end):
q = ['' for _ in range(10000)]
visited = ['' for _ in range(10000)]
front = -1
rear = 0
q[rear] = start
visited[start] = 'start'
cnt = 0
while front != rear:
front += 1
num = q[front]
for command, new in DSLR(num).items():
if new == end: # end(target)์ ๋๋ฌํ๋ฉด
return visited[num][5:] + command # ์์์ ๋จ์ด 'start'์ ์ธํ๊ณ ์ถ๋ ฅ
if not visited[new]:
cnt += 1
rear += 1
q[rear] = new
visited[new] = visited[num] + command
T = int(input())
for _ in range(T):
initial, target = map(int, input().split()) # initial: A, target: B
print(bfs(initial, target))
์ฐธ๊ณ
while
๋ฌธ์ ์ข
๋ฃ ์กฐ๊ฑด์ q
์์ ๊ฐ์ ๋ฝ๊ณ ๋ ํ๋ก ํ๋ค. ๊ฒฐ๊ณผ๋ ์๊ฐ์ด๊ณผ....end
๊น์ง ๋จ๊ณ๋ฅผ ๋ง์ด ๊ฑฐ์น ๊ฒฝ์ฐ, end
์ ๋๋ฌํ๋๋ผ๋ ์ข
๋ฃ์กฐ๊ฑด(q
์์ pop
ํ ๋)์ ๋ง๋๊ธฐ ์ ๊น์ง ๋ค๋ฅธ ๋ถํ์ํ ์์
์ด ์งํ๋๋ค๋ ์ ์ ๋ฐ๊ฒฌํ๋ค. for
๋ฌธ ์์ผ๋ก ์ข
๋ฃ์กฐ๊ฑด์ ์ฎ๊ธฐ๋๊น ํต๊ณผ๋๋ค...