코딩테스트 문제

[Python] 반복문으로 dfs 구현하기

왕초보코딩러 2025. 1. 14. 16:37
728x90

1. 현재 노드를 스택에 삽입 (visited는 빈 리스트)

2. 스택에서 노드를 꺼낸다.

3. 꺼낸 노드가 방문되지 않았다면 인접 노드를 전부 스택에 넣는다

2, 3 반복

 

def dfs(start_node, graph):
    st = [start_node]
    visited = []
    
    while st:
        v = st.pop()
        # 방문하지 않았다면
        if v not in visited:
            # 방문 처리
            visited.append(v)
            print(v, end=' ')
            # 스택에 넣는다(graph가 오름차순으로 정렬되어 있고, 오름차순으로 방문)
            st.extend(graph[v][::-1])

 

visited = []로 하지 않고

특정 값(0)으로 사용해서 리스트 형식으로 사용해도 된다

def dfs(start_node, graph):
    st = [start_node]
    visited = [0] * (n + 1)  # 방문 체크 배열
    
    while st:
        v = st.pop()
        # 방문하지 않았다면
        if visited[v] == 0:  # 방문하지 않은 경우
            # 방문 처리
            visited[v] = 1
            print(v, end=' ')
            # 스택에 넣는다(graph가 오름차순으로 정렬되어 있고, 오름차순으로 방문)
            st.extend(graph[v][::-1])

 

알고리즘 수업 - 깊이 우선 탐색 2

https://www.acmicpc.net/problem/24480

 

visited로 빈 set 사용

import sys
input = sys.stdin.readline

def dfs(start):
    cnt = 1
    st = [start]
    visited = set()
    res = [0] * (n+1)
    while st:
        node = st.pop()
        if node not in visited:
            visited.add(node)
            res[node] = cnt
            cnt += 1
            st.extend(graph[node])
    for r in res[1:]:
        print(r)    
    
n, m, r = map(int, input().split())
graph = [[] for _ in range(n + 1)]

for _ in range(m):
    u, v = map(int, input().split())
    graph[u].append(v)
    graph[v].append(u)
    
for g in graph:
    g.sort()
    
dfs(r)

 

visited와 res를 합치기

import sys
input = sys.stdin.readline

def dfs(start):
    cnt = 1
    st = [start]
    visited = [0] * (n+1)
    while st:
        node = st.pop()
        if visited[node] == 0:
            visited[node] = cnt
            cnt += 1
            st.extend(graph[node])
    for r in visited[1:]:
        print(r)    
    
n, m, r = map(int, input().split())
graph = [[] for _ in range(n + 1)]

for _ in range(m):
    u, v = map(int, input().split())
    graph[u].append(v)
    graph[v].append(u)
    
for g in graph:
    g.sort()
    
dfs(r)

 


알고리즘 수업 - 깊이 우선 탐색 3

https://www.acmicpc.net/problem/24481

 

visited로 빈 set 사용

import sys
input = sys.stdin.readline

def dfs(start):
    st = [(start, 0)]
    visited = set()
    depth = [-1] * (n+1)
    
    while st:
        node, dep = st.pop()
        if node not in visited:
            visited.add(node)
            depth[node] = dep
            for v in graph[node][::-1]:
                st.append((v, dep+1))

    for d in depth[1:]:
        print(d)
n, m, r = map(int, input().split())
graph = [[] for _ in range(n + 1)]

for _ in range(m):
    u, v = map(int, input().split())
    graph[u].append(v)
    graph[v].append(u)
    
for g in graph:
    g.sort()
    
dfs(r)

 

visited와 depth를 합치기

import sys
input = sys.stdin.readline

def dfs(start):
    st = [(start, 0)]
    visited = [-1] * (n+1)
    
    while st:
        node, dep = st.pop()
        if visited[node] == -1:
            visited[node] = dep
            for v in graph[node][::-1]:
                st.append((v, dep+1))

    for d in visited[1:]:
        print(d)
n, m, r = map(int, input().split())
graph = [[] for _ in range(n + 1)]

for _ in range(m):
    u, v = map(int, input().split())
    graph[u].append(v)
    graph[v].append(u)
    
for g in graph:
    g.sort()
    
dfs(r)

'코딩테스트 문제' 카테고리의 다른 글

[백준/Python] LCS  (0) 2025.01.19
[백준/Python] 동물원  (0) 2024.10.29
[백준/Python] 이진 검색 트리  (1) 2024.10.17
[Python/백준] 트리 순회  (1) 2024.10.15
[백준/Python] 트리의 부모 찾기  (0) 2024.10.14