[Baekjoon/๐ฅโ ค] 9251: ์จ๋ฐ๊ผญ์ง3
๐โโ๏ธ ์จ๋ฐ๊ผญ์ง3
์๋น์ด๋ ๋์๊ณผ ์จ๋ฐ๊ผญ์ง์ ํ๊ณ ์๋ค. ์๋น์ด๋ ํ์ฌ ์ N(0 โค N โค 100,000)์ ์๊ณ , ๋์์ ์ K(0 โค K โค 100,000)์ ์๋ค. ์๋น์ด๋ ๊ฑท๊ฑฐ๋ ์๊ฐ์ด๋์ ํ ์ ์๋ค. ๋ง์ฝ, ์๋น์ด์ ์์น๊ฐ X์ผ ๋ ๊ฑท๋๋ค๋ฉด 1์ด ํ์ X-1 ๋๋ X+1๋ก ์ด๋ํ๊ฒ ๋๋ค. ์๊ฐ์ด๋์ ํ๋ ๊ฒฝ์ฐ์๋ 0์ด ํ์ 2*X์ ์์น๋ก ์ด๋ํ๊ฒ ๋๋ค.
์๋น์ด์ ๋์์ ์์น๊ฐ ์ฃผ์ด์ก์ ๋, ์๋น์ด๊ฐ ๋์์ ์ฐพ์ ์ ์๋ ๊ฐ์ฅ ๋น ๋ฅธ ์๊ฐ์ด ๋ช ์ด ํ์ธ์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
๐โโ๏ธ ์ ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์ ์๋น์ด๊ฐ ์๋ ์์น N๊ณผ ๋์์ด ์๋ ์์น K๊ฐ ์ฃผ์ด์ง๋ค. N๊ณผ K๋ ์ ์์ด๋ค.
๐โโ๏ธ ์ถ๋ ฅ
์๋น์ด๊ฐ ๋์์ ์ฐพ๋ ๊ฐ์ฅ ๋น ๋ฅธ ์๊ฐ์ ์ถ๋ ฅํ๋ค.
๐ฉโ๐ป Algoritm: bfs ์ ์ฉ
์๋น์ด๊ฐ ๋์์ ์ฐพ๋ ๊ฐ์ฅ ๋น ๋ฅธ ์๊ฐ์ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค. ๋ฐ๋ผ์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด bfs๋ฅผ ์ ์ฉํ์๋ค.
โจ๏ธ bfs
from collections import deque
import sys
def bfs():
dq = deque([[s, 0]])
visited = set([s])
while dq:
cur, time = dq.popleft()
if cur == b:
print(time)
return
else:
if cur < b:
if cur*2 not in visited:
dq.append([cur*2, time])
visited.add(cur*2)
if cur+1 not in visited:
dq.append([cur+1, time+1])
visited.add(cur+1)
if cur > 0 and cur-1 not in visited:
dq.append([cur-1, time+1])
visited.add(cur-1)
s, b = map(int, sys.stdin.readline().split())
if b < s:
print(s-b)
else:
bfs()
ํ์ง๋ง ์ด๋ ๊ฒ ์ง๊ณ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ณด๋ ์ค๋ต์ด์๋ค. ์ด์ ๊ฐ ๋ฌด์์ผ๊น ๊ณ ๋ฏผ์ ํ๋ ์ค ํ ๊ฒ์๊ธ์ ํตํด์ ๊ทธ ์์ธ์ ํ์ ํ ์ ์์๋ค.
์ฐ์ ๊ทธ๋ํ ํ์ ๋ฌธ์ ์์ ์ฌ์ฉํ ์ ์๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์ ํ ๋ฒ ์ ๋ฆฌํด๋ณด์!
โญ ๊ทธ๋ํ ํ์
- ๋ชจ๋ ๊ฐ์ค์น ๋์ผ
- dfs/bfs
- ํ ๋ ธ๋์์ ๋ค๋ฅธ ๋ ธ๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ
- ์์ ๊ฐ์ค์น ์กด์ฌ
- ๋ฒค๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ
- ์์ ๊ฐ์ค์น๋ง ์กด์ฌ
- ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ
- ๋ชจ๋ ๋ ธ๋ ์ฌ์ด์ ์ต๋จ ๊ฑฐ๋ฆฌ
- ํ๋ก์ด๋ ์์ฌ ์๊ณ ๋ฆฌ์ฆ
๊ทธ๋ ๋ค! ์๋ bfs/dfs๋ ๋ชจ๋ ๊ฐ์ ์ ๊ฐ์ค์น๊ฐ ๋์ผํ๋ค๋ ์ ์ ์กฐ๊ฑด์ด ์์ด์ผ ํ๋ค. ๋ฐ๋ผ์ ๊ฐ์ค์น๊ฐ 0/1์ธ ์ด ๋ฌธ์ ๋ ๋จ์ bfs๋ฅผ ํตํด ํด๊ฒฐํ ์ ์๋ค.
์ด๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ โญ๊ฐ์ค์น๊ฐ 0์ธ ๊ฒฝ์ฐ๋ฅผ ํ์ ๋งจ ์์ ๋ฃ์ด์ค์ผ๋ก์จโญ ์ฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ด๋ค. ๊ทธ๋ ๋ค๋ฉด ์๋ ์ฝ๋๋ฅผ ํตํด ์์ธํ ์ดํด๋ณด์!!
โจ๏ธ 0-1 bfsโญ
from collections import deque
import sys
def bfs():
dq = deque([[s, 0]])
visited = set([s])
while dq:
cur, time = dq.popleft()
if cur == b:
print(time)
return
else:
if cur < b:
if cur*2 not in visited:
dq.appendleft([cur*2, time]) # โญโญโญ
visited.add(cur*2)
if cur+1 not in visited:
dq.append([cur+1, time+1])
visited.add(cur+1)
if cur > 0 and cur-1 not in visited:
dq.append([cur-1, time+1])
visited.add(cur-1)
s, b = map(int, sys.stdin.readline().split())
if b < s:
print(s-b)
else:
bfs()
๐ฉโ๐ป Algoritm: ๋ค์ต์คํธ๋ผ
ํด๋น ๋ฌธ์ ๋ ๋ชจ๋ ๊ฐ์ ์ ๊ฐ์ค์น๊ฐ ๋์ผํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ค์ต์คํธ๋ผ๋ฅผ ํ์ฉํด ๋ฌธ์ ๋ฅผ ํ์ดํ๋ ๊ฒ์ด ์ข๋ค!
๋ค์ต์คํธ๋ผ๋ ์์์ ๊ฐ๋จํ ์ค๋ช ํ๋ฏ์ด ํ๋์ ์ ์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๋ฅผ ํ์ฉํ ํ์ด๋ฅผ ํ์ธํด๋ณด์!!
import sys
from heapq import heappop, heappush
inf = sys.maxsize # ์ ์ ์ต๋๊ฐ
s, b = map(int, sys.stdin.readline().split())
dp = [inf]*100001
heap = []
def dijkstra(s, b):
if b <= s:
print(s-b)
return
heappush(heap, [0, s])
while heap:
t, c = heappop(heap)
if c == b:
print(t)
return
else:
for nx in [c*2, c+1, c-1]:
if 0<= nx <= 100000:
if nx == c*2 and dp[nx] == inf:
dp[nx] = t
heappush(heap, [t, nx])
elif dp[nx] == inf:
dp[nx] = t+1
heappush(heap, [t+1, nx])
dijkstra(s, b)
๋๊ธ๋จ๊ธฐ๊ธฐ