TIL 05-05

๊น€๋•ํ˜‘ยท2026๋…„ 5์›” 6์ผ

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
5/41

๐Ÿ“… 2026-05-05 (ํ™”)

๐ŸŽฏ ์˜ค๋Š˜ ํ•™์Šตํ•œ ๋ชฉํ‘œ

  • Aํ˜• ๊ธฐ์ถœ๋ฌธ์ œ ํ’€๊ธฐ

๋ฌธ์ œ ์ •๋ณด

ํ’€์ด ๊ณผ์ •

1 ๋ฌธ์ œ ๋ถ„์„ ๋ฐ ์ œ์•ฝ ์กฐ๊ฑด ํ™•์ธ

๊ฐ€๋กœ ์ด๋™์˜ ๊ฒฝ์šฐ 0์ด ์•„๋‹ˆ๋ฉด ๋ชป๊ฐ€๊ฒŒ ๊ตฌํ˜„ํ•˜๋ฉด ๋˜๊ฒ ์ง€๋งŒ, ์„ธ๋กœ ์ด๋™์˜ ๊ฒฝ์šฐ 0์ด์–ด๋„ 1์ด ๋‚˜์˜ฌ ๋•Œ ๊นŒ์ง€ ๋๊นŒ์ง€ ๊ฐ€๋ด์•ผํ•œ๋‹ค.

2 ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฐ ์ž๋ฃŒ๊ตฌ์กฐ ์„ ํƒ

heapq๋ฅผ ์‚ฌ์šฉํ•œ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜

3 ์ ˆ์ฐจ์  ๊ตฌํ˜„ ํ๋ฆ„

๊ฐ€๋กœ ์ด๋™ (์ขŒ์šฐ)์˜ ๊ฒฝ์šฐ 1์ด๋ฉด ๊ฐ€๊ณ , 0์ด๋ฉด ๊ฐ€์ง€ ์•Š๋Š”๋‹ค.
์„ธ๋กœ ์ด๋™์˜ ๊ฒฝ์šฐ 1์ด๋ฉด ๊ฐ€๊ณ , 0์ด๋ผ๋ฉด 1์ด ๋‚˜์˜ฌ ๋•Œ ๊นŒ์ง€ ๊ณ„์† ํƒ์ƒ‰์„ ์ด์–ด๊ฐ„๋‹ค.

1์„ ๋งŒ๋‚ฌ๋‹ค๋ฉด difficulty๋ฅผ ๋น„๊ตํ•ด์„œ ์—…๋ฐ์ดํŠธ ํ•  ์ง€ ๋ง์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ  ์—…๋ฐ์ดํŠธ ๋˜์—ˆ๋‹ค๋ฉด queue์— ์‚ฝ์ž…ํ•œ๋‹ค.

4 ์‹œ๊ฐ„ ๋ณต์žก๋„

์ •์  ์ˆ˜ : O(H * W)
๊ฐ ์ •์ ์—์„œ ๊ฐ€๋กœ ์ด๋™O(1), ์„ธ๋กœ ์ด๋™ ์‹œ ๊ฐ™์€ ์—ด์„ ๋๊นŒ์ง€ ํ›‘๋Š” ๊ฒฝ์šฐ ์ตœ์•… O(H)
๋”ฐ๋ผ์„œ ํ•œ ์ •์ ๋‹น ๊ฐ„์„  ์ˆ˜๋Š” O(H), ์ „์ฒด ๊ฐ„์„  ์ˆ˜๋Š” O(N ยท H) = O(Hยฒ ยท W)
๋‹ค์ต์ŠคํŠธ๋ผ ์ „์ฒด ๋ณต์žก๋„: O(Hยฒ ยท W ยท log(H ยท W))

5 ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ

import heapq
 
def dijkstra(start_y, start_x):
    queue = []
    dist[start_y][start_x] = 0
    heapq.heappush(queue, (dist[start_y][start_x] ,start_y, start_x))
 
    while queue:
        difficulty, sy, sx = heapq.heappop(queue)
         
        if grid[sy][sx] == 3:
            return difficulty
         
        if difficulty > dist[sy][sx]:   # ์—…๋ฐ์ดํŠธ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด
            continue
         
        # ๊ฐ€๋กœ(X์ขŒํ‘œ)์ด๋™
        for dx in [-1, 1]:
            nx = sx + dx
            if 0 <= nx < W and grid[sy][nx] in (1, 3):   # ์œ ํšจ ๋ฒ”์œ„ ๋‚ด + ๋ฐ›์นจ์ด๋ผ๋ฉด, ๋‚œ์ด๋„์— ๋ณ€ํ™”๋Š” ์—†๋‹ค (๊ฐ€๋กœ ์ด๋™ ์‹œ์—๋Š”)
                if dist[sy][nx] > difficulty:
                    dist[sy][nx] = difficulty
                    heapq.heappush(queue, (dist[sy][nx], sy, nx))
             
        # ์„ธ๋กœ(Y์ขŒํ‘œ)์ด๋™
        for dy in [-1, 1]:
            ny = sy + dy
             
            # 1์นธ์‹ ์ด๋™ ์„ฑ๊ณตํ–ˆ๋‹ค๋ฉด ๋‚œ์ด๋„๋Š” 1์ด๋‹ค. ๋‚œ์ด๋„ ์—…๋ฐ์ดํŠธ๋Š” ํ˜„์žฌ ๋‚œ์ด๋„์™€ ๋น„๊ตํ•ด์„œ ๋” ํฐ ๋‚œ์ด๋„๋กœ ํ•ด์•ผํ•จ.
            if 0 <= ny < H and grid[ny][sx] in (1, 3):
                cost = 1
                diff = max(cost, difficulty)
                if dist[ny][sx] > diff:
                    dist[ny][sx] = diff
                    heapq.heappush(queue, (dist[ny][sx], ny, sx))
             
            # ๋นˆ ๊ณต๊ฐ„ ์ด๋ผ๋ฉด
            elif 0 <= ny < H and grid[ny][sx] == 0:
                # ํ•˜๋ฝ ์ค‘์ด์—ˆ๋‹ค๋ฉด
                if dy == 1:
                    for k in range(1, H):
                        k_ny = ny + k
                        if 0 <= k_ny < H and grid[k_ny][sx] in (1, 3):
                            cost = abs(k_ny - sy)
                            diff = max(cost, difficulty)
                            if dist[k_ny][sx] > diff:
                                dist[k_ny][sx] = diff
                                heapq.heappush(queue, (dist[k_ny][sx], k_ny, sx))
                                break
                
                # ์ƒ์Šน ์ค‘์ด์—ˆ๋‹ค๋ฉด
                else:
                    for k in range(-1, -H, -1):
                        k_ny = ny + k
                        if 0 <= k_ny < H and grid[k_ny][sx] in (1, 3):
                            cost = abs(k_ny - sy)
                            diff = max(cost, difficulty)
                            if dist[k_ny][sx] > diff:
                                dist[k_ny][sx] = diff
                                heapq.heappush(queue, (dist[k_ny][sx], k_ny, sx))
                                break
                                     
 
INF = float('inf')
T = int(input())
for tc in range(1, T+1):
    W, H = map(int, input().split())    # W๋Š” ๊ฐ€๋กœ(X์ขŒํ‘œ), H๋Š” y์ขŒํ‘œ
    grid = [list(map(int, input().split())) for _ in range(H)]
 
    dist = [[INF] * W for _ in range(H)]

    ans = 0
    found = False
    sy = -1
    sx = -1
    # ์‹œ์ž‘์  (2 ์ฐพ๊ธฐ)
    for y in range(H):
        for x in range(W):
            if grid[y][x] == 2:
                sy, sx = y, x
                found = True
                break
        if found:
            break

    ans = dijkstra(sy, sx)
    print(f"#{tc} {ans}")
profile
๋ญ˜๋ด

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