카테고리 없음

[TIL] 99클럽 코테 스터디 4일차 TIL - DFS: 백준 24479 알고리즘 수업 - 깊이 우선 탐색 1 문제 풀이 with python

데이by데이 2024. 11. 1. 10:58

Today's keyword : DFS

  DFS(깊이 우선 탐색)는 그래 탐색 알고리즘 중 하나, 가능한 깊게 노드를 탐색 후, 더 이상 갈 수 없 되 마지막 분기점으로 돌아가서 다른 경로를 탐색하는 방식입니다. DFS는 스택을 사용하여 구현할 수 있으며, 재귀적으로도 구현 수 있습니다.

문제 설명

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

백준의 "DFS와 BFS" 문제(문제 번호: 24479)는 그래프 탐색 알고리즘 중 깊이 우선 탐색(DFS)을 구현하는 문제입니다. 주어진 그래프에서 특정 시작 정점으로부터의 방문 순서를 출력하는 것이 목표입니다.

입력

  • 첫 번째 줄에 정점의 수 n, 간선의 수 m, 시작 정점 r이 주어집니다.
  • 다음 m개의 줄에는 간선 정보가 주어지며, 각 줄은 두 정점 a와 b를 나타냅니다. 이는 a와 b가 연결되어 있음을 의미합니다.

출력

  • 각 정점에 대해 방문 순서를 출력합니다. 방문하지 않은 정점은 0으로 표시합니다.

예제 

 

문제풀이

import sys
sys.setrecursionlimit(10 ** 6)  # 재귀 깊이 제한 설정
input = sys.stdin.readline  # 입력을 빠르게 받기 위한 설정

# 정점의 수, 간선의 수, 시작 정점 입력
n, m, r = map(int, input().split())
# 인접 리스트 초기화 (1부터 n까지 사용하기 위해 n+1 크기로 생성)
graph = [[] for _ in range(n + 1)]
# 방문 순서를 저장할 리스트 초기화 (0이면 방문하지 않음)
visited = [0] * (n + 1)

# 방문 순서를 기록할 변수 초기화
visit_order = 1

def dfs(graph, v, visited):
    global visit_order
    visited[v] = visit_order  # 현재 정점을 방문했음을 기록
    visit_order += 1  # 다음 방문 순서 증가

    # 현재 정점 v의 인접 정점들을 순회
    for neighbor in graph[v]:
        if visited[neighbor] == 0:  # 방문하지 않은 정점인 경우
            dfs(graph, neighbor, visited)  # 재귀적으로 DFS 호출

# m개의 간선 정보 입력받기
for _ in range(m):
    a, b = map(int, input().split())
    graph[a].append(b)  # a에서 b로의 간선 추가
    graph[b].append(a)  # b에서 a로의 간선 추가 (양방향)

# 각 정점의 인접 리스트를 오름차순으로 정렬
for i in range(1, n + 1):
    graph[i].sort()

# DFS 탐색 시작
dfs(graph, r, visited)

# 각 정점의 방문 순서 출력 (1부터 n까지)
for i in range(1, n + 1):
    print(visited[i])

이 문제는 DFS를 사용하여 그래프를 탐색하고, 각 정점의 방문 순서를 기록하는 방식으로 해결합니다.

1.그래프 초기화

  • n, m, r을 입력받아 정점 수, 간선 수, 시작 정점을 설정합니다.
  • 인접 리스트 형태로 그래프를 표현하기 위해 graph 리스트를 초기화합니다.
  • visited 리스트를 초기화하여 각 정점의 방문 순서를 저장합니다.

2. DFS 구현

  • DFS 함수 dfs(graph, v, visited)를 정의합니다. 이 함수는 현재 정점 v를 방문하고, 인접한 정점들을 재귀적으로 방문합니다.
  • 방문할 때마다 visited[v]에 현재 방문 순서를 기록합니다.

3. 간선 정보 입력

  • m개의 간선 정보를 입력받아 그래프에 추가합니다. 양방향 간선이므로 두 정점 모두에 대해 연결을 추가합니다.

4. 정점 정렬

  • 각 정점의 인접 리스트를 오름차순으로 정렬하여, DFS 탐색 시 정점이 작은 순서대로 방문되도록 합니다.
  • graph : [[], [4, 2], [1, 3, 4], [2, 4], [1, 2, 3], []] -> [[], [2, 4], [1, 3, 4], [2, 4], [1, 2, 3], []]

5. DFS 호출 및 결과 출력

  • 시작 정점 r에서 DFS를 호출하고, 각 정점의 방문 순서를 출력합니다.

 

 

 

 

#99클럽 #코딩테스트준비 #개발자취업 #항해99 #TIL