1. ๊ผญ ํ•„์š”ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ ๊ธฐ์ดˆ

  • ํƒ์ƒ‰ : ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ ์ค‘์—์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๊ณผ์ •, ๋Œ€ํ‘œ์ ์ธ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ DFS, BFS
  • ์ž๋ฃŒ๊ตฌ์กฐ : ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•™ ๊ด€๋ฆฌํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์กฐ

์Šคํƒ Stack

  • ์„ ์ž…ํ›„์ถœ First In Last Out ๊ตฌ์กฐ ๋˜๋Š” ํ›„์ž…์„ ์ถœ Last In First Out ๊ตฌ์กฐ
  • ํŒŒ์ด์ฌ์—์„œ ์Šคํƒ์„ ์ด์šฉํ•  ๋•Œ๋Š” ๋ณ„๋„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด append() pop() list๋ฅผ ํ™œ์šฉํ•œ๋‹ค.

ํ Queue

  • ์„ ์ž…์„ ์ถœ First In First Out ๊ตฌ์กฐ
from collections import deque

queue = deque()

queue.append(5)
queue.append(2)
queue.append(3)
queue.popleft()
  • ํŒŒ์ด์ฌ์œผ๋กœ ํ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” collections ๋ชจ๋“ˆ์—์„œ ์ œ๊ณตํ•˜๋Š” deque ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•˜์ž.
  • ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ  ๋นผ๋Š” ์†๋„๊ฐ€ ๋ฆฌ์ŠคํŠธ์— ๋น„ํ•ด ํšจ์œจ์ ์ด๋ฉฐ queue ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๊ฐ„๋‹จํ•˜๋‹ค.

์žฌ๊ท€ํ•จ์ˆ˜

  • ์ž๊ธฐ ์ž์‹ ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜
  • ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋ฌดํ•œ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋„๋ก ์žฌ๊ท€ํ•จ์ˆ˜์˜ ์ข…๋ฃŒ์กฐ๊ฑด์„ ๋ฐ˜๋“œ์‹œ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค.
  • ์ปดํ“จํ„ฐ ๋‚ด๋ถ€์—์„œ ์žฌ๊ท€ ํ•จ์ˆ˜์˜ ์ˆ˜ํ–‰์€ ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ๋‹ค.
  • ๋ฐ˜๋ณต๋ฌธ ๋Œ€์‹  ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋” ๊ฐ„๊ฒฐํ•ด์ง„๋‹ค.

2. ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ DFS/BFS

  • ๊ทธ๋ž˜ํ”„๋Š” Node์™€ Edge๋กœ ํ‘œํ˜„๋˜๋ฉฐ ์ด๋•Œ ๋…ธ๋“œ๋ฅผ ์ •์ ์ด๋ผ๊ณ ๋„ ๋งํ•œ๋‹ค.
  • ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์ด๋ž€, ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋ฅผ ์‹œ์ž‘์œผ๋กœ ๋‹ค์ˆ˜์˜ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.
  • ๋‘ ๋…ธ๋“œ๊ฐ€ ๊ฐ„์„ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋ฉด ๋‘ ๋…ธ๋“œ๋Š” ์ธ์ ‘ํ•˜๋‹ค๋ผ๊ณ  ํ‘œํ˜„ํ•œ๋‹ค.

๊ทธ๋ž˜ํ”„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐฉ์‹

  • ์ธ์ ‘ ํ–‰๋ ฌ : 2์ฐจ์› ๋ฐฐ์—ด์— ๊ฐ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋œ ํ˜•ํƒœ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๋ฐฉ์‹
  • ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ : ๋ชจ๋“  ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ์ €์žฅ (ํŒŒ์ด์ฌ์€ 2์ฐจ์› ๋ฆฌ์ŠคํŠธ)
    • ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํšจ์œจ์ 

DFS (Depth-First Search), ๊นŠ์ด ์šฐ์„ ํƒ์ƒ‰

  • ํŠน์ •ํ•œ ๊ฒฝ๋กœ๋กœ ํƒ์ƒ‰ํ•˜๋‹ค๊ฐ€ ํŠน์ •ํ•œ ์ƒํ™ฉ์—์„œ ์ตœ๋Œ€ํ•œ ๊นŠ์ˆ™์ด ๋“ค์–ด๊ฐ€์„œ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•œ ํ›„, ๋‹ค์‹œ ๋Œ์•„๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
  1. ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
  2. ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค. (๋‚ฎ์€ ๋ฒˆํ˜ธ ์ˆœ) ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด ์Šคํƒ์—์„œ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ธ๋‹ค.
  3. 2 ๊ณผ์ •์„ ๋” ์ด์ƒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.
  • DFS๋Š” ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ์— ๊ธฐ์ดˆํ•œ๋‹ค๋Š” ์ ์—์„œ ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•˜๋‹ค. ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๊ฐ€ N๊ฐœ์ธ ๊ฒฝ์šฐ O(N)์˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค.

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

def dfs(graph, v, visited):
    visited[v] = True
    print(v, end=' ')
    for i in graph[v]:
        if not visited[i]: dfs(graph, i, visited)

graph = [
    [], [2,3,8], [1,7], [1,4,5], [3,5], [3,4], [7], [2,6,8], [1,7]
]

visited = [False] * 9
dfs(graph, 1, visited)

BFS (Breadth First Search), ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰

  • ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ํ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ์ •์„
  1. ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
  2. ํ์—์„œ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ด ํ•ด๋‹น ๋…ธ๋“œ์˜ ์ธ์ ‘ ๋…ธ๋“œ ์ค‘์—์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
  3. 2๋ฒˆ ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.
  • ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•จ์— ์žˆ์–ด deque ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์œผ๋ฉฐ O(N)์˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค.
  • ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ ์‹ค์ œ ์ˆ˜ํ–‰์‹œ๊ฐ„์€ DFS๋ณด๋‹ค ์ข‹์€ ํŽธ!

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

from collections import deque

def bfs(graph, start, visited) :
    queue = deque([start])
    visited[start] = True

    while queue :
        v = queue.popleft()
        print(v, end=' ')

        for i in graph[v]:
            if not visited[i]:
                queue.append(i)
                visited[i] = True

3. ์Œ๋ฃŒ์ˆ˜ ์–ผ๋ ค ๋จน๊ธฐ

๋‚œ์ด๋„ ์ค‘ํ•˜

๋ฌธ์ œ

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

ํ•ด์„ค

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

  1. ํŠน์ •ํ•œ ์ง€์ ์˜ ์ฃผ๋ณ€ ์ƒ, ํ•˜, ์ขŒ, ์šฐ๋ฅผ ์‚ดํŽด๋ณธ ๋’ค์— ์ฃผ๋ณ€ ์ง€์  ์ค‘์—์„œ ๊ฐ’์ด 0์ด๋ฉด์„œ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ง€์ ์ด ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ์ง€์ ์„ ๋ฐฉ๋ฌธํ•œ๋‹ค.
  2. ๋ฐฉ๋ฌธํ•œ ์ง€์ ์—์„œ ๋‹ค์‹œ ์ƒ, ํ•˜, ์ขŒ, ์šฐ๋ฅผ ์‚ดํŽด๋ณด๋ฉด์„œ ๋ฐฉ๋ฌธ์„ ๋‹ค์‹œ ์ง„ํ–‰ํ•˜๋ฉด, ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์ง€์ ์„ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. 1~2๋ฒˆ ๊ณผ์ •์„ ๋ชจ๋“  ๋…ธ๋“œ์— ๋ฐ˜๋ณตํ•˜๋ฉด ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ง€์ ์˜ ์ˆ˜๋ฅผ ์„ผ๋‹ค.

์ฝ”๋“œ

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

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

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+1, y)
        dfs(x, y-1)
        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)

4. ๋ฏธ๋กœ ์ฐฐ์ถœ

๋‚œ์ด๋„ ์ค‘ํ•˜

๋ฌธ์ œ

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

ํ•ด์„ค

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

์ฝ”๋“œ

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]

def dfs(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 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))