[TIL_Carrotww] 111 - 23/05/02

์œ ํ˜•์„ยท2023๋…„ 5์›” 2์ผ
1

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
126/138
post-thumbnail

๐Ÿ“Carrotww์˜ ์ฝ”๋”ฉ ๊ธฐ๋ก์žฅ

๐Ÿงฒ python algorithm

๐Ÿ” ๋ฐฑ์ค€ ์ˆจ๋ฐ”๊ผญ์งˆ2

์ฒ˜์Œ bfs๋กœ ํ’€์—ˆ๋‹ค.
bfs๋กœ ํ’€๋ฉด ๋ช‡๊ฐ€์ง€ ์ œ์•ฝ์ด ์žˆ๋Š” ์งœ์ฆ๋‚ฌ๋˜ ๋ฌธ์ œ๋‹ค
๋‹ค์ต์ŠคํŠธ๋ผ๋กœ ํ’€๋ฉด ํŠน๋ณ„ํ•œ ์กฐ๊ฑด ์—†์ด ๊ทธ๋ƒฅ ํ’€๋ฆฌ์ง€๋งŒ ์ฒ˜์Œ ์ ‘๊ทผ์„ bfs๋กœ ํ•˜์—ฌ์„œ ๋๊นŒ์ง€ ๊ณ ์ง‘ํ–ˆ์ง€๋งŒ ๋ถ€๋Ÿฌ์งˆ๋ป”ํ–ˆ๋‹ค...ใ…Ž

  • BFS ํ’€์ด
def solve():
    # bfs
    import sys
    from collections import deque
    N, K = map(int, sys.stdin.readline().split())
    visited = [-1] * 100001
    visited[N] = 0

    queue = deque()
    queue.append(N)
    while queue:
        cur_po = queue.popleft()
        if cur_po == K:
            print(visited[cur_po])
            break
        for i in range(3):
            if i == 0:
                n_po = cur_po * 2
            elif i == 1:
                n_po = cur_po - 1
            else:
                n_po = cur_po + 1

            if n_po < 0 or n_po >= 100001 or visited[n_po] != -1:
                continue
            if i == 0:
                if n_po != 0:
                    visited[n_po] = visited[cur_po]
                    queue.appendleft(n_po)
            else:
                visited[n_po] = visited[cur_po] + 1
                queue.append(n_po)

if __name__ == "__main__":
    solve()

๋ฌธ์ œ๊ฐ€ ์–ด์ด ์—†๋Š”๊ฒŒ ๊ณฑํ•˜๊ธฐ ๋ถ€๋ถ„์ด ๋จผ์ € ๋“ค์–ด๊ฐ€์•ผํ•ด์„œ appendleft๋ฅผ ํ•ด์ฃผ์—ˆ๋Š”๋ฐ queue์— ๊ณฑํ•˜๊ธฐ ๋ถ€๋ถ„์„ ๋จผ์ € ๋„ฃ์–ด์ฃผ์ง€ ์•Š์œผ๋ฉด ์•ˆ๋˜๋Š” ์ผ€์ด์Šค๊ฐ€ ์žˆ๋‹ค.
์ด๊ฒƒ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์„ ์ข€ ์Ÿ์•˜๋‹ค...ใ… 

  • ๋‹ค์ต์ŠคํŠธ๋ผ ํ’€์ด
def solve():
    # Dj
    import sys
    import heapq

    N, K = map(int, sys.stdin.readline().split())
    visited = [-1] * 100001
    heap = []
    heapq.heappush(heap, [0, N])

    while heap:
        cnt, cur_node = heapq.heappop(heap)
        if cur_node == K:
            print(cnt)
            break
        for i in range(3):
            if i == 0:
                n_cnt = cnt
                n_node = cur_node * 2
            elif i == 1:
                n_cnt = cnt + 1
                n_node = cur_node + 1
            else:
                n_cnt = cnt + 1
                n_node = cur_node - 1
            if n_node < 0 or n_node >= 100001 or visited[n_node] != -1:
                continue
            visited[n_node] = cnt
            heapq.heappush(heap, [n_cnt, n_node])

if __name__ == "__main__":
    solve()

ํ›จ์”ฌ ์ง๊ด€์ ์ด๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€