새벽_나그네
12시 지난 새벽
새벽_나그네
전체 방문자
오늘
어제
  • 분류 전체보기
    • TIL
    • DevLog
    • Algorithm
    • ComputerScience
    • etc

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Selenium 4
  • til
  • 내일배움캠프
  • docker
  • 개발일지
  • Github
  • machine learning
  • 국비지원
  • 내일배움카드
  • 프로그래머스
  • TodayILearned
  • 자기주도학습
  • 스파르타코딩클럽
  • 코딩프로젝트
  • 내일배움단
  • 코린이
  • 코딩
  • AI트랙
  • portfolio
  • Python

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
새벽_나그네

12시 지난 새벽

[백준_1260] DFS와 BFS
Algorithm

[백준_1260] DFS와 BFS

2022. 5. 6. 00:09

문제 보기: https://www.acmicpc.net/problem/1260

 

1260번: DFS와 BFS

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사

www.acmicpc.net

문제

그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.

 

입력

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.

출력

첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다.

 

새로 사용된 개념

1. 깊이 우선 탐색 (DFS, Depth-First Search)

: 최대한 깊이 내려간 뒤, 더이상 깊이 갈 곳이 없을 경우 옆으로 이동

 

 

💡 깊이 우선 탐색의 개념

루트 노드(혹은 다른 임의의 노드)에서 시작해서 다음 분기(branch)로 넘어가기 전에

해당 분기를 완벽하게 탐색하는 방식을 말합니다.

 

예를 들어, 미로찾기를 할 때 최대한 한 방향으로 갈 수 있을 때까지 쭉 가다가

더 이상 갈 수 없게 되면 다시 가장 가까운 갈림길로 돌아와서

그 갈림길부터 다시 다른 방향으로 탐색을 진행하는 것이 깊이 우선 탐색 방식이라고 할 수 있습니다.

 

1. 모든 노드를 방문하고자 하는 경우에 이 방법을 선택함

2. 깊이 우선 탐색(DFS)이 너비 우선 탐색(BFS)보다 좀 더 간단함

3. 검색 속도 자체는 너비 우선 탐색(BFS)에 비해서 느림

 

2. 너비 우선 탐색 (BFS, Breadth-First Search)

: 최대한 넓게 이동한 다음, 더 이상 갈 수 없을 때 아래로 이동

 

 

💡 너비 우선 탐색의 개념

루트 노드(혹은 다른 임의의 노드)에서 시작해서 인접한 노드를 먼저 탐색하는 방법으로,

시작 정점으로부터 가까운 정점을 먼저 방문하고 멀리 떨어져 있는 정점을 나중에 방문하는 순회 방법입니다.

 

주로 두 노드 사이의 최단 경로를 찾고 싶을 때 이 방법을 선택합니다.

ex) 지구 상에 존재하는 모든 친구 관계를 그래프로 표현한 후 Sam과 Eddie사이에 존재하는 경로를 찾는 경우

 

* 깊이 우선 탐색의 경우 - 모든 친구 관계를 다 살펴봐야 할지도 모름

* 너비 우선 탐색의 경우 - Sam과 가까운 관계부터 탐색


출처 : https://devuna.tistory.com/32

 

[알고리즘] 깊이 우선 탐색(DFS) 과 너비 우선 탐색(BFS)

[알고리즘] 깊이 우선 탐색(DFS)과 너비 우선 탐색(BFS) 그래프를 탐색하는 방법에는 크게 깊이 우선 탐색(DFS)과 너비 우선 탐색(BFS)이 있습니다. 📌여기서 그래프란, 정점(node)과 그 정점을 연

devuna.tistory.com

새로운 함수 

print(*dfslist)
print(*bfslist)

리스트를 출력할때 *을 사용하여 대괄호를 제외하고 출력할 수 있다.

 

풀이 과정

1. dfs와 bfs는 따로 변수를 구성하여 작업을 하도록 한다.

2. 정점의 갯수대로 visit 정보를 나타낼수 있는 리스트를 준비한다.

3. bfs와 dfs 함수를 따로 구성하는데 그 방법은 밑의 설명과 같다.

4. bfs에서는 큐의 형태라고 생각하면서 방문했는지 여부를 확인해서 append

5. dfs는 재귀함수를 이용하여 한쪽 끝까지 탐색하면서 값을 얻어낸다.

 

코드

import sys

n, m, v = map(int, sys.stdin.readline().split())
lines = [[0 for _ in range(n + 1)] for __ in range(n + 1)]

for _ in range(m):
    a, b = map(int, sys.stdin.readline().split())
    lines[a][b] = lines[b][a] = 1
dfsvisited = [0 for _ in range(n + 1)]
bfsvisited = [0 for _ in range(n + 1)]
dfslist = []
bfslist = []


def dfs(x):
    dfsvisited[x] = 1
    dfslist.append(x)
    for i in range(1, n + 1):
        if dfsvisited[i] == 0 and lines[x][i] == 1:
            dfs(i)


def bfs(x):
    q = [x]
    bfsvisited[x] = 1
    while q:
        x = q.pop(0)
        bfslist.append(x)
        for i in range(1, n + 1):
            if bfsvisited[i] == 0 and lines[x][i] == 1:
                q.append(i)
                bfsvisited[i] = 1


dfs(v)
bfs(v)
print(*dfslist)
print(*bfslist)
저작자표시 비영리 변경금지 (새창열림)

'Algorithm' 카테고리의 다른 글

[백준_2108] 통계학  (0) 2022.05.07
[백준_18258] 큐 2  (0) 2022.05.06
[백준_1874] 스택 수열  (0) 2022.05.05
[백준_4949] 균형잡힌 세상  (0) 2022.05.04
[백준_1010] 다리 놓기  (0) 2022.05.03
    'Algorithm' 카테고리의 다른 글
    • [백준_2108] 통계학
    • [백준_18258] 큐 2
    • [백준_1874] 스택 수열
    • [백준_4949] 균형잡힌 세상
    새벽_나그네
    새벽_나그네
    IT, 프로그래밍, 정보, 스마트스토어

    티스토리툴바