๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm/๋ฐฑ์ค€(BOJ)

[ ํŒŒ์ด์ฌ(python) ] ๋ฐฑ์ค€ 1260 - DFS์™€ BFS

by YWTechIT 2021. 4. 16.
728x90

๐Ÿ“Œ ๋ฐฑ์ค€ 1260 - DFS์™€ BFS

๋ฌธ์ œ ์„ค๋ช…


๐Ÿ’ก ๋‚˜์˜ ํ’€์ด

BFS์™€ DFS๋ฅผ ๋‘˜ ๋‹ค ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ์ธ๋ฐ ํ’€์ด ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ๋ฌธ์ œ์—์„œ ์ •์  ๋ฒˆํ˜ธ๊ฐ€ ์ž‘์€ ๊ฒƒ์„ ๋จผ์ € ๋ฐฉ๋ฌธํ•œ๋‹ค.๋ฅผ ํ†ตํ•ด ์ž…๋ ฅ๊ฐ’์„ ์ธ์ ‘๋ฆฌ์ŠคํŠธ(adjacent list)์œผ๋กœ ๋„ฃ์„ ๋•Œ sort๋ฅผ ๋ถ™์—ฌ ์ž‘์€ ๊ฐ’๋ถ€ํ„ฐ ๋“ค์–ด๊ฐ€๊ฒŒ๋” ์„ค์ •ํ–ˆ๋‹ค.

 

dfs์˜ ๊ตฌํ˜„ ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ์ฒ˜์Œ ๋“ค์–ด์˜จ ๊ฐ’ index์˜ flag๋ฅผ True๋กœ ๋ฐ”๊พผ๋‹ค.
  2. ๋งŒ์•ฝ, ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด(flag = False), ํ•ด๋‹น ์ธ์ ‘๋…ธ๋“œ๋กœ ๋“ค์–ด๊ฐ€์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์—†์„ ๋•Œ๊นŒ์ง€ ๋“ค์–ด๊ฐ„๋‹ค.(recursive)
  3. ์žฌ๊ท€๋ฌธ์„ ํƒˆ์ถœํ•˜๋ฉด์„œ ํ•ด๋‹น ๊ฐ’์„ ํ•˜๋‚˜์”ฉ ์ถœ๋ ฅํ•œ๋‹ค.
728x90

bfs์˜ ๊ตฌํ˜„์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ์ฒ˜์Œ ๋“ค์–ด์˜จ ๊ฐ’์„ queue์— ๋„ฃ๋Š”๋‹ค.
  2. ์ฒ˜์Œ ๋“ค์–ด์˜จ ๊ฐ’ index์˜ flag๋ฅผ True๋กœ ๋ฐ”๊พผ๋‹ค.
  3. ๋จผ์ € ๋“ค์–ด์˜จ ๊ฐ’์„ queue์—์„œ ๋จผ์ € ๊บผ๋‚ด๋ฉด์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด๊ณ , ์žˆ์œผ๋ฉด ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ queue์— ๋„ฃ๋Š”๋‹ค.
  4. queue์— ๋‚จ์€ ๊ฐ’์ด ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.
  5. queue์—์„œ ๊บผ๋‚ธ ๊ฐ’์„ ํ•˜๋‚˜์”ฉ ์ถœ๋ ฅํ•œ๋‹ค.

 

์—ฌ๋‹ด์ด์ง€๋งŒ, ์–ด์ œ ํ’€์—ˆ๋˜ ๋ฌธ์ œ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํ’€์—ˆ๋Š”๋ฐ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค.

  1. sys.stdin.readline์„ ์‚ฌ์šฉํ•˜๋‹ˆ๊นŒ ์‹œ๊ฐ„์ด 2๋ฐฐ๊ฐ€๋Ÿ‰ ์ค„์–ด๋“ค์—ˆ๋‹ค.
  2. flag(True)๋ฐฉ์‹์ด append๋ฐฉ์‹๋ณด๋‹ค ์‹คํ–‰์‹œ๊ฐ„์„ ์•ฝ 4๋ฐฐ๊ฐ€๋Ÿ‰ ๋‹จ์ถ•์‹œ์ผฐ๋‹ค.
    ์™œ๋ƒํ•˜๋ฉด, if i not in visited๋Š” ๋ฐ˜๋ณต๋ฌธ์•ˆ์— ์žˆ๋Š” ์›์†Œ๋“ค์„ ํ•˜๋‚˜์”ฉ ๊ฒ€์‚ฌํ•ด์•ผ ํ•˜์ง€๋งŒ, if not visited[i]๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ True, False์—ฌ๋ถ€๋งŒ ๋”ฐ์ง€๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฆ‰, ๋…ธ๋“œ ๊ฐœ์ˆ˜ n์ด ์ปค์ง€๊ฒŒ๋˜๋ฉด ๊ทธ๋งŒํผ ์—ฐ์‚ฐ ํšŸ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚œ๋‹ค๋Š” ๋ฌธ์ œ์ ์ด ์žˆ๋‹ค.

 

import sys
from collections import deque
input = sys.stdin.readline

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

def bfs(graph, start):   # implementation bfs function
    queue = deque([start])
    bfs_visited[start] = True
    while queue:
        v = queue.popleft()
        print(v, end=' ')
        for i in graph[v]:
            if not bfs_visited[i]:
                queue.append(i)
                bfs_visited[i] = True

N, M, V = map(int, input().split())
graph = [[] for _ in range(N+1)]
dfs_visited, bfs_visited = [False] * (N+1), [False] * (N+1) # flag init

for i in range(M):
    node1, node2 = map(int, input().split())
    graph[node1].append(node2)
    graph[node2].append(node1)

graph = [sorted(i) for i in graph] # sort by ascending order

dfs(graph, V)
print()
bfs(graph, V)
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€