๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ProgramSolve/Baekjoon

[BOJ] 13549๋ฒˆ - ์ˆจ๋ฐ”๊ผญ์งˆ3 (Python)

by SooooooooS 2023. 9. 5.
728x90

๐Ÿ› ๏ธ ๋ฌธ์ œ ๐Ÿ› ๏ธ


๐Ÿ—’๏ธ ์„ค๋ช… ๐Ÿ—’๏ธ

์–ด์ œ ๊ณต๋ถ€ํ•œ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์—ฐ์Šตํ•ด๋ณด์•˜๋‹ค.

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ 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)
728x90