Notice
Recent Posts
Link
Today
Total
10-06 02:35
๊ด€๋ฆฌ ๋ฉ”๋‰ด

dingdong coding

[ ์ด๊ฒƒ์ด ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋‹ค with ํŒŒ์ด์ฌ ] DFS/BFS ๋ณธ๋ฌธ

๐Ÿ”ตCoding Test/Algorithm

[ ์ด๊ฒƒ์ด ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋‹ค with ํŒŒ์ด์ฌ ] DFS/BFS

๐Ÿถ ๊ฐœ๋ฐœ๊ฐœ๋ฐœ ๐Ÿพ 2022. 3. 21. 23:26

๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ DFS/BFS

 

โ€ฃ ํƒ์ƒ‰ : ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ ์ค‘์—์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๊ณผ์ • 

โ€ฃ ์Šคํƒ : FILO (First In Last Out)  ์ž…๊ตฌ = ์ถœ๊ตฌ ( Python์˜ List append, pop )

print(stack [ : : -1]) # ์ตœ์ƒ๋‹จ ์›์†Œ๋ถ€ํ„ฐ ์ถœ๋ ฅ
print(stack) # ์ตœํ•˜๋‹จ ์›์†Œ๋ถ€ํ„ฐ ์ถœ๋ ฅ

โ€ฃ ํ : FIFO (First In First Out) ์ž…๊ตฌ ≠ ์ถœ๊ตฌ ( Python์˜ deque ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ append, popleft )

from collections import deque
queue = deque()
###
print(queue) # ๋จผ์ € ๋“ค์–ด์˜จ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅ
queue.reverse()
print(queue) # ๋‚˜์ค‘์— ๋“ค์–ด์˜จ ์›์†Œ๋ถ€ํ„ฐ ์ถœ๋ ฅ

โ€ฃ ์žฌ๊ท€ํ•จ์ˆ˜ : ์ž์ง€ ์ž์‹ ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜ (Recursive Function) ๋ฌดํ•œ๋ฃจํ”„ →  ์ข…๋ฃŒ์กฐ๊ฑด ๋ฐ˜๋“œ์‹œ ๋ช…์‹œ ex) ํŒฉํ† ๋ฆฌ์–ผ

# ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ตฌํ˜„ํ•œ n!
def factorial_iterative(n):
    result = 1
    # 1๋ถ€ํ„ฐ n๊นŒ์ง€์˜ ์ˆ˜๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ๊ณฑํ•˜๊ธฐ
    for i in range(1, n + 1):
        result *= i
    return result


# ์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„ํ•œ n!
def factorial_recursive(n):
    if n <= 1: #n์ด 1 ์ดํ•˜์ธ ๊ฒฝ์šฐ 1์„ ๋ฐ˜ํ™˜
        return 1
    # n != n * (n-1)! ๋ฅผ ๊ทธ๋Œ€๋กœ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๊ธฐ
    return n*factorial_recursive(n-1)

# ๊ฐ๊ฐ์˜ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•œ n!์ถœ๋ ฅ (n=5)
print('๋ฐ˜๋ณต์ ์œผ๋กœ ๊ตฌํ˜„:', factorial_iterative(5))
print('์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„:', factorial_recursive(5))

โ€ฃ ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ DFS (Depth-Frist Search) : ๊นŠ์€ ๋ถ€๋ถ„์„ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ( ์Šคํƒ or ์žฌ๊ท€ ํ•จ์ˆ˜ ์ด์šฉ)

# DFS ๋ฉ”์„œ๋“œ ์ •์˜
def dfs(graph, v, visited):
    # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ
    visited[v] = True
    print(v, end=' ')
    # ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋ฐฉ๋ฌธ
    for i in graph[v]:
        if not visited[i]:
            dfs(graph, i, visited)

# ๊ฐ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋œ ์ •๋ณด๋ฅผ ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒํ˜•์œผ๋กœ ํ‘œํ˜„ (2์ฐจ์› ๋ฆฌ์ŠคํŠธ)
graph = [
    [],
    [2, 3, 8],
    [1, 7],
    [1, 4, 5],
    [3, 5],
    [3, 4],
    [7],
    [2, 6, 8],
    [1, 7]
]

# ๊ฐ ๋…ธ๋“œ๊ฐ€ ๋ฐฉ๋ฌธ๋œ ์ •๋ณด๋ฅผ ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒํ˜•์œผ๋กœ ํ‘œํ˜„ (1์ฐจ์› ๋ฆฌ์ŠคํŠธ)
visited = [False]*9

# ์ •์˜๋œ DFS ํ•จ์ˆ˜ ํ˜ธ์ถœ
dfs(graph, 1, visited)

โ€ฃ ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ BFS (Breadth-First Search) : ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ( ํ ์ด์šฉ )

# DFS ๋ฉ”์„œ๋“œ ์ •์˜
def dfs(graph, v, visited):
    # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ
    visited[v] = True
    print(v, end=' ')
    # ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋ฐฉ๋ฌธ
    for i in graph[v]:
        if not visited[i]:
            dfs(graph, i, visited)

# ๊ฐ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋œ ์ •๋ณด๋ฅผ ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒํ˜•์œผ๋กœ ํ‘œํ˜„ (2์ฐจ์› ๋ฆฌ์ŠคํŠธ)
graph = [
    [],
    [2, 3, 8],
    [1, 7],
    [1, 4, 5],
    [3, 5],
    [3, 4],
    [7],
    [2, 6, 8],
    [1, 7]
]

# ๊ฐ ๋…ธ๋“œ๊ฐ€ ๋ฐฉ๋ฌธ๋œ ์ •๋ณด๋ฅผ ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒํ˜•์œผ๋กœ ํ‘œํ˜„ (1์ฐจ์› ๋ฆฌ์ŠคํŠธ)
visited = [False]*9

# ์ •์˜๋œ DFS ํ•จ์ˆ˜ ํ˜ธ์ถœ
dfs(graph, 1, visited)

1. ์Œ๋ฃŒ์ˆ˜ ์–ผ๋ ค ๋จน๊ธฐ (์‹ค์ „๋ฌธ์ œ)

2. ๋ฏธ๋กœํƒˆ์ถœ (์‹ค์ „๋ฌธ์ œ)

 

[ ์‹ค์ „๋ฌธ์ œ ] ์Œ๋ฃŒ์ˆ˜ ์–ผ๋ ค ๋จน๊ธฐ 

โ€ป ๋ฌธ์ œ

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

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

๋Œœ์Œ 4 x 5 ์–ผ์Œ ํ‹€ ์˜ˆ์‹œ์—์„œ๋Š” ์•„์ด์Šคํฌ๋ฆผ์ด ์ด 3๊ฐœ ์ƒ์„ฑ๋œ๋‹ค.

 

0 0 1 1 0
0 0 0 1 1
1 1 1 1 1
0 0 0 0 0

 

์ž…๋ ฅ์กฐ๊ฑด

- ์ฒซ ๋ฒˆ์งธ ์ค„์— ์–ผ์Œ ํ‹€์˜ ์„ธ๋กœ ๊ธธ์ด N๊ณผ ๊ฐ€๋กœ๊ธธ์ด M์ด ์ฃผ์–ด์ง„๋‹ค. 

- ๋‘ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ N+1 ๋ฒˆ์งธ ์ค„๊นŒ์ง€ ์–ผ์Œ ํ‹€์˜ ํ˜•ํƒœ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

- ์ด๋•Œ ๊ตฌ๋ฉ์ด ๋šซ๋ ค์žˆ๋Š” ๋ถ€๋ถ„์€ 0, ๊ทธ๋ ‡์ง€ ์•Š์€ ๋ถ€๋ถ„์€ 1์ด๋‹ค.

 

์ถœ๋ ฅ์กฐ๊ฑด 

- ํ•œ ๋ฒˆ์— ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์•„์ด์Šคํฌ๋ฆผ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

# ์Œ๋ฃŒ์ˆ˜ ์–ผ๋ ค๋จน๊ธฐ
# ํ’€์ด ํ•ด์„ค
n, m = map(int, input().split())

arr = []

for i in range(n):
    arr.append(list(map(int, input())))

def dfs(x, y):
    if x <= -1 or x >= n or y <= -1 or y > m:
        return False
    if arr[x][y] == 0:
        arr[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):
        if dfs(i, j) == True:
            result += 1

print(result)

 

[ ์‹ค์ „๋ฌธ์ œ ] ๋ฏธ๋กœ ํƒˆ์ถœ

โ€ป ๋ฌธ์ œ

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

์ด ๋•Œ ๋™๋นˆ์ด๊ฐ€ ํƒˆ์ถœํ•ด์•ผํ•˜๋Š” ์ตœ์†Œ ์นธ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜์‹œ๋กœ. ์นธ์„ ์…€ ๋•Œ๋Š” ์‹œ์ž‘ ์นธ๊ณผ ๋งˆ์ง€๋ง‰ ์นธ์„ ๋ชจ๋‘ ํฌํ•จํ•ด์„œ ๊ณ„์‚ฐํ•œ๋‹ค.

 

์ž…๋ ฅ์กฐ๊ฑด

- ์ฒซ์งธ ์ค„์— ๋‘ ์ •์ˆ˜ N, M์ด ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ๊ฐ M๊ฐœ์˜ ์ •์ˆ˜๋กœ ๋ฏธ๋กœ์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ๊ฐ์˜ ์ˆ˜ ๋“ค์€ ๊ณต๋ฐฑ ์—†์ด ๋ถ™์–ด์„œ ์ž…๋ ฅ์œผ๋กœ ์ œ์‹œ๋œ๋‹ค. ๋˜ํ•œ ์‹œ์ž‘ ์นธ๊ณผ ๋งˆ์ง€๋ง‰ ์นธ์€ ํ•ญ์ƒ 1์ด๋‹ค.

 

์ถœ๋ ฅ์กฐ๊ฑด 

- ์ฒซ์งธ ์ค„์— ์ตœ์†Œ ์ด๋™ ์นธ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

# ๋ฏธ๋กœ ํƒˆ์ถœ
# ํ’€์ด ํ•ด์„ค
from collections import deque

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

arr = []

for i in range(n):
    arr.append(list(map(int, input())))

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()
        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 arr[nx][ny] == 1:
                arr[nx][ny] = arr[x][y] + 1
                queue.append((nx, ny))
    return arr[n - 1][m - 1]

print(bfs(0, 0))

 

๊ฐ•์˜ ๋ฐ ์ถœ์ฒ˜

 

 

 

Comments