๐Ÿ“š Study/Baekjoon

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค Lv2 | dfs/bfs | ๊ฒŒ์ž„ ๋งต ์ตœ๋‹จ๊ฑฐ๋ฆฌ

์œฐ๊ฐฑ 2026. 4. 1. 17:16

https://school.programmers.co.kr/learn/courses/30/lessons/1844

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

SW๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ‰๊ฐ€, ๊ต์œก์˜ Total Solution์„ ์ œ๊ณตํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์„ฑ์žฅ์„ ์œ„ํ•œ ๋ฒ ์ด์Šค์บ ํ”„

programmers.co.kr

 

 

queue visited ์ฒ˜๋ฆฌํ•˜๋Š”๊ฑธ

๋„ฃ์ž๋งˆ์ž ํ•˜์ง€ ์•Š๊ณ  ๋นผ๋‚ผ ๋•Œ ํ•˜๋ฉด ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋œฌ๋‹ค ์ฒ˜์Œ ์•Œ์•˜์Œ ใ…‡ใ…ใ…‡

 

<์˜ˆ์‹œ>

1 1
1 1

์œ„์™€ ๊ฐ™์€ ์˜ˆ์‹œ์ผ ๋•Œ

1. pop์ดํ›„์— visited ์ฒ˜๋ฆฌํ•˜๋ฉด

queue = [(0,0)]

queue = [(0,1), (1,0)]

queue = [(1,0), (1,1)]

queue = [(1,1), (1,1)] <<< ๋‘๋ฒˆ ๋“ค์–ด๊ฐ

2. queue ๋„ฃ์ž๋งˆ์ž visited ์ฒ˜๋ฆฌํ•˜๋ฉด

queue = [(0,0)]

queue = [(0,1), (1,0)]

queue = [(1,0), (1,1)]

queue = [(1,1)]

 

from collections import deque
def bfs(x, y, maps, n, m, cnt):
    queue = deque([(x,y,cnt)]) # ์ฒ˜์Œ ์‹œ์ž‘ (0,0,1)
    maps[x][y] = 2 # ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
    # ์ƒ/ํ•˜/์ขŒ/์šฐ
    dx = [-1, 1, 0, 0]
    dy = [0, 0, -1, 1]
    
    while queue:
        x, y, cnt = queue.popleft()
        if x == n-1 and y == m-1: # ์ข…๋ฃŒ ์กฐ๊ฑด
                return cnt
        
        for i in range(4): # ๋‹ค์Œ ์œ„์น˜์— ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ํ›„๋ณด๋“ค
            nx, ny = x + dx[i], y + dy[i]
            if 0 <= nx < n and 0 <= ny < m: # ์œ„์น˜๊ฐ€ ๋ฒ”์œ„ ์•ˆ์— ์žˆ์–ด์•ผ ํ•จ
                if maps[nx][ny] == 1: # ๋ฐฉ๋ฌธํ•œ ์ ์ด ์—†๊ณ (2) ๋ฒฝ์ด ์•„๋‹ˆ์–ด์•ผ ํ•จ(0)
                    queue.append((nx, ny, cnt+1))
                    maps[nx][ny] = 2 # ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
    # ๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ฒฝ๋กœ์ผ ๋•Œ (queue๋ฅผ ๋‹ค ๋น„์› ๋Š”๋ฐ๋„ ์ข…๋ฃŒ ์กฐ๊ฑด ์„ฑ๋ฆฝ์„ ์•ˆ ํ•จ)
    return -1
    
def solution(maps):
    # ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๋ฌธ์ œ -> bfs ์ ‘๊ทผ
    # ๋„์ฐฉํ•  ์ˆ˜ ์—†์„ ๋•Œ๋Š” -1 ๋ฐ˜ํ™˜
    # ์ถœ๋ฐœ (0,0) -> ๋„์ฐฉ (n-1, n-1)
    n, m = len(maps), len(maps[0])
    answer = bfs(0, 0, maps, n, m, 1)
    return answer