๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป Programming/์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ…Œ์ŠคํŠธ

[BFS] ๋ฏธ๋กœ ํƒˆ์ถœ

by ๋ญ…์ฆค 2021. 5. 17.
๋ฐ˜์‘ํ˜•

- ๋ฌธ์ œ

์ฃผ์ธ๊ณต์€ NxM ํฌ๊ธฐ์˜ ์ง์‚ฌ๊ฐํ˜• ํ˜•ํƒœ์˜ ๋ฏธ๋กœ์— ๊ฐ‡ํ˜€ ์žˆ๋‹ค. ์ฃผ์ธ๊ณต์˜ ์œ„์น˜๋Š” (1,1) ์ด๊ณ  ๋ฏธ๋กœ์˜ ์ถœ๊ตฌ๋Š” (N,M)์˜ ์œ„์น˜์— ์กด์žฌํ•˜๋ฉฐ ํ•œ๋ฒˆ์— ํ•œ ์นธ์”ฉ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ดด๋ฌผ์ด ์žˆ๋Š” ๋ถ€๋ถ„์€ 0 ์—†๋Š” ๋ถ€๋ถ„์€ 1๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ๋‹ค. ์ด ๋•Œ ์ฃผ์ธ๊ณต์ด ํƒˆ์ถœํ•˜๊ธฐ ์œ„ํ•ด ์›€์ง์—ฌ์•ผํ•˜๋Š” ์ตœ์†Œ ์นธ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜์‹œ์˜ค. ๋‹จ ์นธ์„ ์…€ ๋•Œ๋Š” ์‹œ์ž‘ ์นธ๊ณผ ๋งˆ์ง€๋ง‰ ์นธ์„ ๋ชจ๋‘ ํฌํ•จํ•ด์„œ ๊ณ„์‚ฐํ•œ๋‹ค.

 

- ํ•ด์„ค

BSF๋กœ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ. BFS๋Š” ์‹œ์ž‘ ์ง€์ ์—์„œ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

๊ทธ๋Ÿฌ๋ฏ€๋กœ (1,1) ์ง€์ ์—์„œ๋ถ€ํ„ฐ BFS๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋ชจ๋“  ๋…ธ๋“œ์˜ ๊ฐ’์„ ๊ฑฐ๋ฆฌ ์ •๋ณด๋กœ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค. 

 

from collections import deque

n,m = map(int, input().split())

# 2์ฐจ์› ๋ฆฌ์ŠคํŠธ์˜ ๋งต ์ •๋ณด ์ž…๋ ฅ๋ฐ›๊ธฐ
graph = []
for i in range(n):
    graph.append(list(map(int,input().split())))

# ์ด๋™ํ•  ๋ฐฉํ–ฅ ์ •์˜, ์ƒํ•˜์ขŒ์šฐ
dx = [-1,1,0,0]
dy = [0,0,-1,1]

def bfs(x,y):
    queue = deque()
    queue.append((x,y))         # ์ฒ˜์Œ ๊ฐ’ ํ์— ์ €์žฅ

    while queue:
        x,y = queue.popleft()   # ํ์—์„œ ๋นผ์„œ x,y์— ์ €์žฅ
        # ํ˜„์žฌ ์œ„์น˜์—์„œ ์ƒํ•˜์ขŒ์šฐ ์œ„์น˜ ํ™•์ธ
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if nx<0 or ny<0 or nx >=n or ny >=m :   # ๊ณต๊ฐ„ ๋ฒ—์–ด๋‚œ ๊ฒฝ์šฐ ๋ฌด์‹œ
                continue
            if graph[nx][ny]==0:                    # ๋ฒฝ์ธ ๊ฒฝ์šฐ ๋ฌด์‹œ
                continue
            if graph[nx][ny]==1:                    # ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ -> ํ•ด๋‹น ๋…ธ๋“œ์— ๊ฑฐ๋ฆฌ ์ •๋ณด ์ €์žฅ
                graph[nx][ny] = graph[x][y] + 1
                queue.append((nx,ny))               # ํ์— ๋ฐฉ๋ฌธํ•œ ์œ„์น˜ ์ €์žฅ 
                                                    # -> ์ด ์œ„์น˜๋ฅผ ๋‹ค์‹œ ์œ„์—์„œ .popleft() ํ•ด์„œ ๋นผ์„œ x,y์— ๋„ฃ๊ณ  ๋ฐ˜๋ณต
    return graph[n-1][m-1]

print(bfs(0,0))

 

๋ฐ˜์‘ํ˜•