๐ ๏ธ ๋ฌธ์ ๐ ๏ธ
๐๏ธ ์ค๋ช ๐๏ธ
์ด์ ๊ณต๋ถํ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ฐ์ตํด๋ณด์๋ค.
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ๊ณผ BFS 2๊ฐ์ง ๋ฐฉ์์ผ๋ก ํ์ด๋ณด์๋ค. (์ฝ๋๋ ์๋์)
1. ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ ํ์ด
1. ์๋น์ด์ ์์น๋ฅผ ์์ ์ ์ ์ผ๋ก ๋๋ค.
2. ํ์ฌ ์์น i์ +1, -1 *2 ํ ์์น์ ๋ํด ์ ์ฅ๋์ด ์๋ ์๊ฐ times[k]์ ๋๋ฌํ ์๊ฐ(times[i] + 1 ๋๋ times[i])์ ๋น๊ตํ์ฌ ๋๋ฌํ ์๊ฐ์ด ๋ ์์ผ๋ฉด times[k]๋ฅผ ๊ฐฑ์ ํ๋ค.
3. heap์ด ๋น ๋๊น์ง 2๋ฒ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
์ด๋, ์ฃผ์ํ ์ ์ ๊ฐ์ค์น๊ฐ ์์ง๋ง ๊ฐ์ค์น๋ก ์๊ฐํ ๊ฐ์ ๋๋ฌํ ์๊ฐ์ผ๋ก times์ ๊ฐ์ด๋ค.
๋ง์ฝ ์ด๋ฅผ times๋ฅผ ๋์ฐฉ ์ ์ ์ ๊ฐ์๋งํผ๋ง ๋ง๋ค๋ฉด ์ฌ๋ฐ๋ฅธ ๊ฐ์ ๋์ถํ์ง ๋ชปํ ๊ฒ์ด๋ค.
์์ ๋ฌธ์ ์์ ์ฃผ์ด์ง ์์๋ง ๋ด๋ 17์ ๋์ฐฉํ๋ ์๊ฐ์ ๊ตฌํด์ผํ๋๋ฐ 18์ ๋ํ ๊ฐ๋ ํ์ํ ๊ฒ์ ์ ์ ์๋ค.
2. BFS๋ฅผ ์ด์ฉํ ํ์ด
์ด ๋ฌธ์ ์์ ๊ทธ๋ํ๋ ๊ฐ์ค์น๊ฐ ์๋ ๊ทธ๋ํ๋ก ์ ์ ์ ํ์ํ์ฌ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋์์ ์์น๋ก ๋์ฐฉํ๋ฉด ๋๋ค.
์ฆ, ๊ฐ์ค์น๊ฐ ์๋ ๊ทธ๋ํ์์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ ๋ BFS๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ ์ ์๋ค.
์์ ํ์ด๊ฐ BFS, ์๋์ ํ์ด๊ฐ ๋ค์ต์คํธ๋ผ๋ฅผ ์ด์ฉํ ๊ฒ์ผ๋ก ๋ค์ต์คํธ๋ผ ๋ณด๋ค BFS ํ์ด์ ์๊ฐ์ด ๋ ๋น ๋ฅธ ๊ฒ์ ๋ณผ ์ ์๋ค.
๊ทธ ์ด์ ์ ๋ํด ์๊ฐํด๋ณด๋ฉด ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ ๋ heap ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋๋ฐ ์ด๋ ์ฝ์ ๋์์ด ๋ฐ์ํ ๋๋ง๋ค ์ฃผ์ด์ง ๊ฐ์ค์น์ ๋ํด ๊ฐฑ์ ์ด ์ด๋ค์ ธ์ผํ๋ค. ๋ฐ๋ฉด์ BFS์์๋ queue๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ์ ๊ณผ์ ์ ์ถ๊ฐ์ ์ธ ๋์์ด ์์ผ๋ฏ๋ก BFS๋ฅผ ์ด์ฉํ ํ์ด๊ฐ ๋ ๋น ๋ฅด๊ฒ ๋์ฌ ์ ์๋ค.
๐ ํ์ด ๐
1. ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ ํ์ด
import sys
import heapq
n, k = map(int, sys.stdin.readline().split())
def dijkstra(start, end) :
times = [sys.maxsize] * 100001
heap = []
times[start] = 0
heapq.heappush(heap, [times[start], start])
while heap :
t, v = heapq.heappop(heap)
for n in [v + 1, v - 1, v * 2] :
if n >= 0 and n <= 100000 :
if n == v * 2 and times[n] > t :
times[n] = t
heapq.heappush(heap, [times[n], n])
elif times[n] > t + 1 :
times[n] = t + 1
heapq.heappush(heap, [times[n], n])
print(times[end])
dijkstra(n, k)
2. BFS๋ฅผ ์ด์ฉํ ํ์ด
import sys
from collections import deque
n, k = map(int, sys.stdin.readline().split())
def BFS(start, end) :
times = [sys.maxsize] * 100001
queue = deque()
times[start] = 0
queue.append(start)
while queue :
current = queue.popleft()
for n in [current + 1, current - 1, current * 2] :
if n >= 0 and n <= 100000 :
if n == current * 2 and times[n] > times[current] :
times[n] = times[current]
queue.append(n)
elif times[n] > times[current] + 1 :
times[n] = times[current] + 1
queue.append(n)
print(times[end])
BFS(n, k)
'ProgramSolve > Baekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 15657๋ฒ - N๊ณผM(8) (Python) (1) | 2023.10.05 |
---|---|
[BOJ] 1911๋ฒ - ํ๊ธธ ๋ณด์ํ๊ธฐ (Python) (0) | 2023.09.07 |
[BOJ] 1753๋ฒ - ์ต๋จ๊ฒฝ๋ก(Python) + Dijkstra Algorithm (0) | 2023.09.04 |
[BOJ] 6064๋ฒ - ์นด์ ๋ฌ๋ ฅ(JAVA) (0) | 2023.03.27 |
[BOJ] 2667๋ฒ - ๋จ์ง๋ฒํธ๋ถ์ด๊ธฐ(JAVA) (0) | 2023.03.23 |