[백준/Python] 1260번 DFS와 BFS

2025. 2. 17. 14:24·알고리즘문제풀이

문제

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


개념 이해

오늘은 미루고 미뤄왔던 DFS와 BFS의 개념을 정리하며 문제를 풀어보려 한다.

학부 과정중에 잠깐 배웠던 적이 있는데 다 까먹어버렸다..

 

용어정리

  • 정점 / 노드 : 특정 위치
  • 간선 : 위치 간의 관계, 정점(노드)을 연결한 선

 

DFS

DFS란? 깊이 우선 탐색, 그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘

재귀 함수 또는 스택을 이용해 알고리즘을 구현한다.

 

BFS

BFS란? 너비 우선 탐색, 그래프에서 가까운 노드부터 우선적으로 탐색하는 알고리즘

큐를 이용해 알고리즘을 구현한다.


문제풀이(정답)

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

# 행렬 만들기
graph = [[0] * (n+1) for _ in range(n+1)]
for _ in range(m):
    x, y = map(int, input().split())
    graph[x][y] = graph[y][x] = 1       # 정점이 연결되어 있으면 1

# 방문 리스트 만들기
visited1 = [0] * (n+1)       # dfs
visited2 = [0] * (n+1)       # bfs

def dfs(v):
    visited1[v] = 1      # 시작 노드 방문 표시
    print(v, end=' ')
    for i in range(1, n+1):
        if graph[v][i] == 1 and visited1[i] == 0: # 노드가 연결되어 있고 방문한 적이 없다
            dfs(i)

dfs(v)
print() # 들여쓰기

def bfs(v):
    queue = [v]
    visited2[v] = 1
    while queue:
        v = queue.pop(0)    # 방문 노드 제거
        print(v, end=' ')
        for i in range(1, n+1):
            if graph[v][i] == 1 and visited2[i] == 0:
                queue.append(i)    # 큐에 i를 삽입
                visited2[i] = 1    # 방문처리
bfs(v)

 

먼저 graph변수에 (n+1)X(n+1) 행렬을 만들어 연결된 노드들에 대해 1을 할당해 주었다.

그리고 DFS와 BFS에 각각 방문 리스트를 만들어 주었다. 노드가 방문했으면 1 그렇지 않으면 0으로 표기했다.

 

그리고 DFS를 구하는 함수를 작성했다.

 

  1. 현재 노드 v를 방문했다고 표시 (visited1[v] = 1)
  2. 방문한 노드를 출력 (print(v, end=' '))
  3. 1번 노드부터 n번 노드까지 순회하면서,
    • 현재 노드 v와 연결된 노드 i를 찾고 (graph[v][i] == 1)
    • 방문하지 않은 경우 (visited1[i] == 0), 해당 노드에서 다시 dfs(i) 호출

 

 

 

그 후, BFS를 구하는 함수를 작성했다.

 

  1. 시작 노드를 큐에 넣고 방문 처리 (queue = [v], visited2[v] = 1)
  2. 큐에서 노드를 꺼내 출력 (print(v, end=' '))
  3. 1번 노드부터 n번 노드까지 탐색하며,
    • 현재 노드 v와 연결된 i를 찾고 (graph[v][i] == 1)
    • 방문하지 않았다면 (visited2[i] == 0),
      • queue.append(i) (큐에 삽입)
      • visited2[i] = 1 (방문 체크)
  4. 큐가 빌 때까지 위 과정을 반복

내일은 DFS와 BFS의 개념을 알았으니 관련 문제를 풀어봐야겠다.

 

저작자표시 비영리 변경금지 (새창열림)

'알고리즘문제풀이' 카테고리의 다른 글

[백준/Python] 2178번 미로 탐색  (0) 2025.02.19
[백준/Python] 1697번 숨바꼭질  (0) 2025.02.18
[백준/Python] 2579번 계단 오르기  (0) 2025.02.14
[프로그래머스/Python] 실패율  (0) 2025.02.13
[백준/Python] 1002번 터렛  (0) 2025.02.12
'알고리즘문제풀이' 카테고리의 다른 글
  • [백준/Python] 2178번 미로 탐색
  • [백준/Python] 1697번 숨바꼭질
  • [백준/Python] 2579번 계단 오르기
  • [프로그래머스/Python] 실패율
jungyn
jungyn
jungyn 님의 블로그 입니다.
  • jungyn
    jungyn 님의 블로그
    jungyn
  • 전체
    오늘
    어제
    • 분류 전체보기 (36)
      • 알고리즘문제풀이 (31)
      • 제로인턴 (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    2차원행렬
    후기
    DP
    시간초과
    18110
    1629
    프로그래머스
    11729
    통계헉
    2563
    다이나믹프로그래밍
    solved.ac
    스택
    교점개수
    카드1
    제로인턴
    counter
    2606
    스택 수열
    스택 2
    너비우선탐색
    사전직무교육
    2108
    BFS
    수들의 합 2
    28278
    SYS
    백준
    1847
    2161
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
jungyn
[백준/Python] 1260번 DFS와 BFS
상단으로

티스토리툴바