suvera-dev ๐Ÿฅฆ

Algorithm) DFS/BFS ์‹ค์ „๋ฌธ์ œ ๋ณธ๋ฌธ

Algorithm/CodingTest - Python

Algorithm) DFS/BFS ์‹ค์ „๋ฌธ์ œ

suvera 2022. 4. 2. 03:21

๐Ÿบ 1๋ฒˆ ์Œ๋ฃŒ์ˆ˜ ์–ผ๋ ค๋จน๊ธฐ

 

N x M ํฌ๊ธฐ์˜ ์–ผ์Œ ํ‹€์ด ์žˆ๋‹ค. ๊ตฌ๋ฉ์ด ๋šซ๋ ค ์žˆ๋Š” ๋ถ€๋ถ„์€ 0, ์นธ๋ง‰์ด๊ฐ€ ์กด์žฌํ•˜๋Š” ๋ถ€๋ถ„์€ 1๋กœ ํ‘œ์‹œ๋œ๋‹ค. 

๊ตฌ๋ฉ์ด ๋šซ๋ ค์žˆ๋Š” ๋ถ€๋ถ„๋ผ๋ฆฌ ์ƒ,ํ•˜,์ขŒ,์šฐ๋กœ ๋ถ™์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค. 

์ด๋•Œ ์–ผ์Œ ํ‹€์˜ ๋ชจ์–‘์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ์ƒ์„ฑ๋˜๋Š” ์ด ์•„์ด์Šคํฌ๋ฆผ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑ

==> DFS๋กœ ํ•ด๊ฒฐ ! ์–ผ์Œ์„ ์–ผ๋ฆด ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„์ด ์ƒํ•˜์ขŒ์šฐ๋กœ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋‹ค๊ณ  ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ทธ๋ž˜ํ”„ ํ˜•ํƒœ๋กœ ๋ชจ๋ธ๋ง ๊ฐ€๋Šฅ ! 

1) ํŠน์ •ํ•œ ์ง€์ ์˜ ์ฃผ๋ณ€ ์ƒํ•˜์ขŒ์šฐ๋ฅผ ์‚ดํŽด๋ณธ ๋’ค์— ์ฃผ๋ณ€ ์ง€์  ์ค‘์—์„œ ๊ฐ’์ด 0 ์ด๋ฉด์„œ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ง€์ ์ด ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ์ง€์  ๋ฐฉ๋ฌธ

2) ๋ฐฉ๋ฌธํ•œ ์ง€์ ์—์„œ ๋‹ค์‹œ ์ƒํ•˜์ขŒ์šฐ๋ฅผ ์‚ดํŽด๋ณด๋ฉด์„œ ๋ฐฉ๋ฌธ์„ ๋‹ค์‹œ ์ง„ํ–‰ํ•˜๋ฉฐ, ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์ง€์  ๋ฐฉ๋ฌธ ๊ฐ€๋Šฅ 

3) 1-2๋ฒˆ์˜ ๊ณผ์ •์„ ๋ชจ๋“  ๋…ธ๋“œ์— ๋ฐ˜๋ณตํ•˜์—ฌ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ง€์ ์˜ ์ˆ˜๋ฅผ ์„ผ๋‹ค ! 

 

#N,M์„ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ž…๋ ฅ๋ฐ›๊ธฐ
n, m = map(int, input())

# 2์ฐจ์› ๋ฆฌ์ŠคํŠธ์˜ ๋งต ์ •๋ณด ์ž…๋ ฅ๋ฐ›๊ธฐ
graph = []
for i in range(n):
    graph.append(list(map(int, input())))
    
# DFS๋กœ ํŠน์ •ํ•œ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•œ ๋’ค์— ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ๋…ธ๋“œ๋“ค๋„ ๋ฐฉ๋ฌธ ! 
def dfs(x, y):
    #์ฃผ์–ด์ง„ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ฆ‰์‹œ ์ข…๋ฃŒ 
    if x <= -1 or x >= n or y <= -1 or y >= m:
        return false 
    # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด 
    if graph[x][y] == 0:
        # ํ•ด๋‹น ๋…ธ๋“œ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ 
        graph[x][y] == 1
        # ์ƒํ•˜์ขŒ์šฐ ์œ„์น˜๋„ ๋ชจ๋‘ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœ 
        dfs(x -1, y)
        dfs(x, y -1)
        dfs(x+1, y)
        dfs(x, y+1)
        return  True
    return  False

# ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•˜์—ฌ ์Œ๋ฃŒ์ˆ˜ ์ฑ„์šฐ๊ธฐ 
result = 0
for i in range(n):
    for j in range(m):
        # ํ˜„์žฌ ์œ„์น˜์—์„œ DFS ์ˆ˜ํ–‰ 
        if dfs(i, j) == True:
            result += 1
        
print(result)

DFS ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌ๋ถ„๋œ ๊ณต๊ฐ„์„ ์ „๋ถ€ ๋ฐฉ๋ฌธํ•œ๋‹ค ! - ์ด์–ด์ ธ ์žˆ๋Š” ๊ณณ์˜ ํƒ์ƒ‰์ด ๋๋‚ฌ์„ ๊ฒฝ์šฐ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ 1๊ฐœ์˜ ์˜์—ญ์ด ์„ธ์–ด์ง€๊ฒŒ ๋œ๋‹ค !

๋ชจ๋“  ๋…ธ๋“œ๋“ค์— ๋Œ€ํ•ด์„œ ์ˆ˜ํ–‰ํ•œ๋‹ค ! 

 

 

๐Ÿ‘€ 2๋ฒˆ ๋ฏธ๋กœ ํƒˆ์ถœ 

 

๋™๋นˆ์ด๋Š” N x M ํฌ๊ธฐ์˜ ์ง์‚ฌ๊ฐํ˜• ํ˜•ํƒœ์˜ ๋ฏธ๋กœ์— ๊ฐ‡ํ˜€์žˆ๋‹ค. ๋ฏธ๋กœ์—๋Š” ์—ฌ๋Ÿฌ ๋งˆ๋ฆฌ์˜ ๊ดด๋ฌผ์ด ์žˆ์–ด ์ด๋ฅผ ํ”ผํ•ด ํƒˆ์ถœํ•ด์•ผํ•œ๋‹ค.

๋™๋นˆ์ด์˜ ์œ„์น˜๋Š” (1,1) ์ด๊ณ  ๋ฏธ๋กœ์˜ ์ถœ๊ตฌ๋Š” (N, M)์˜ ์œ„์น˜์— ์กด์žฌํ•˜๋ฉฐ ํ•œ๋ฒˆ์— ํ•œ ์นธ์”ฉ ์ด๋™ ํ•  ์ˆ˜ ์žˆ๋‹ค. 

์ด๋•Œ ๊ดด๋ฌผ์ด ์žˆ๋Š” ๋ถ€๋ถ„์€ 0์œผ๋กœ, ๊ดด๋ฌผ์ด ์—†๋Š” ๋ถ€๋ถ„์€ 1๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ๋‹ค.

๋ฏธ๋กœ๋Š” ๋ฐ˜๋“œ์‹œ ํƒˆ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ์ œ์‹œ๋œ๋‹ค. ์ด๋•Œ ๋™๋นˆ์ด๊ฐ€ ํƒˆ์ถœํ•˜๊ธฐ ์œ„ํ•ด ์›€์ง์—ฌ์•ผ ํ•˜๋Š” ์ตœ์†Œ ์นธ์˜ ๊ฐœ์ˆ˜. 

๋งˆ์ง€๋ง‰ ์นธ๊ณผ ์‹œ์ž‘์นธ์„ ๋ชจ๋‘ ํฌํ•จํ•˜์—ฌ ๊ณ„์‚ฐ 

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

๊ทธ๋Ÿฌ๋ฏ€๋กœ 1,1 ์—์„œ BFS๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋ชจ๋“  ๋…ธ๋“œ์˜ ๊ฐ’์„ ๊ฑฐ๋ฆฌ ์ •๋ณด๋กœ ๋„ฃ์ž ! ํŠน์ • ๋…ธ๋“œ์— ๋ฐฉ๋ฌธํ•˜๋ฉด ๊ทธ ์ด์ „ ๋…ธ๋“œ์˜ ๊ฑฐ๋ฆฌ์— 1์„ ๋”ํ•œ ๊ฐ’์„ ๋ฆฌ์ŠคํŠธ์— ๋„ฃ๋Š”๋‹ค. ์ฐธ๊ณ ๋กœ, ๋ณธ ๋ฌธ์ œ์—์„œ๋Š” ๋‹จ์ˆœํžˆ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ์œ„์น˜๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์„ ์š”๊ตฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์‹œ ๋Œ์•„๊ฐˆ ๊ฒฝ์šฐ ๋Œ์•„๊ฐ„ ๊ณณ์˜ ์œ„์น˜๊ฐ’์ด ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค ! 

 

from collections import deque

n,m = map(int, input().split())
graph = []
for i in range(n):
    graph.append(list(map(int, input())))

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

# BFS ์†Œ์Šค์ฝ”๋“œ ๊ตฌํ˜„
def bfs(x, y):
    # ํ ๊ตฌํ˜„์„ ์œ„ํ•ด deque ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ
    queue = deque()
    queue.append((x,y))
    # ํ๊ฐ€ ๋นŒ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
    while queue:
        x, y = queue.popleft()
        # ํ˜„์žฌ ์œ„์น˜์—์„œ ๋„ค ๋ฐฉํ–ฅ์œผ๋กœ์˜ ์œ„์น˜ ํ™•์ธ
        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))
    # ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๋ฐ˜ํ™˜ 
    return graph[n-1][m-1]

# ๊ฒฐ๊ณผ ์ถœ๋ ฅ
print(bfs(0,0))
Comments