[알고리즘] DFS & BFS

2022. 7. 30. 18:46· Skils/Algorithm
목차
  1. 📕DFS란?
  2. 📕BFS란?

코딩 테스트에서 자주 사용되는 알고리즘이자  탐색 알고리즘에서 가장 유명한 방법들인 DFS와 BFS를 알아볼 것이다.

 

📕DFS란?

DFS는 (Depth First Search)의 약칭으로 우리말로는 깊이 우선 탐색이라고 한다.

간단하게 말하면 트리나 그래프에서 한 루트로 최대한 깊숙하게 들어가면서 탐색한 뒤  다시 돌아가 다른 루트를 탐색하는 방법이다.

위의 그림처럼 1번에서 2번으로 간뒤 2번의 하위 트리를 끝까지 탐색한 후 되돌아가 다른 경로를 탐색한다.

대표적으로는 백트래킹[Backtracking]에 사용한다.

 

👍장점

  • 현 견로상의 노드들만을 기억하면 되므로 저장 공간의 수요가 비교적 적다.
  • 목표 노드가 깊은 단계에 있을수록, 그 노드가 좌측에 있을수록 BFS보다 해를 빨리 구할 수 있다.

👎단점

  • 해가 없는 경로에 깊이 빠질 가능성이 있다.
  • 얻어진 해가 최단 경로가 된다는 보장이 없다. 이는 목표에 이르는 경로가 다수인 문제에 대해 DFS는 해에 다다르면 탐색을 끝내버리므로, 이때 얻어진 해가 최적이 아닐 수 있다는 뜻이다.

💡구현

재귀호출과 스택으로 할 수 있다.

위의 그림으로 스택의 과정을 설명하겠다.

제일 먼저 트리의 root인 1을 스택에 넣는다.

stack에서 top부분에 있는 노드에서 인접 노드를 찾고 stack에서 push 함. (2번 노드임)

 

그 다음 스택에서 top에 위치한 원소에서 인접 노드를 찾고 stack에 push 함.(3번 노드임)

top 노드에서 인접노드가 없기 때문에 pop 하고 다시 top에 있는 방문 안 한 인접 노드를 찾고 push 함.(4번 노드)

이렇게 top에서 인접노드가 없다면 pop 하고 다시 top에서 방문 안 한 인접 노드를 찾음.(2번 노드)

위의 과정을 끝까지 한다면 위의 결과가 나오게 된다.

📕BFS란?

BFS는 (Breadth First Search)의 약칭으로 우리말로는 너비 우선 탐색이라고 한다.

트리나 그래프에서 출발점을 정하고, 출발점에서 갈 수 있는 모든 경로를 방문한 뒤 다시 연결되어 있는 모든 경로를 탐색한다.

그림으로 이해한다면 쉬울 것이다.

👍장점

  1. 노드의 수가 적고 깊이가 얕은 경우 빠르게 동작할 수 있다.
  2. 단순 검색 속도가 깊이 우선 탐색(DFS) 보다 빠르다.
  3. 너비를 우선 탐색하기에 답이 되는 경로가 어려 개인 경우에도 최단경로임을 보장한다.
  4. 최단경로가 존재한다면 어느 한 경로가 무한하게 깊어진다 해도 최단 경로를 반드시 찾을 수 있다.

👎단점

  1. 재귀 호출의 DFS와는 달리 큐에 다음에 탐색할 정점들을 저장해야 하므로, 저장공간이 많이 필요하다.
  2. 노드의 수가 늘어나면 탐색해야 하는 노드 또한 많아져서 현실적으로는 어렵다.

💡구현

queue를 사용해서 구현할 수 있다.

위의 그림으로 queue를 사용한 구현을 설명하겠다.

  1. 시작 정점을 방문하고 큐에 넣는다.
  2. 큐에서 가장 앞의 노드(front)를 빼고 해당 노드의 인접 노드(방문하지 않은 노드여야 함)를 방문하고 큐에 넣는다.
  3. 큐가 빌 때까지 2번 과정을 반복함.

  1. 큐에 시작 정점인 1을 넣는다.
  2. 큐의 가장 앞의 노드인 1을 빼고 해당 노드의 인접 노드를 방문.
    • 2,3을 방문하고 큐에 넣는다.
  3. 큐의 가장 앞의 노드인 2를 빼고 해당 노드의 인접노드를 방문.
    • 4,5를 방문하고 큐에 넣는다.

 

4. 큐의 가장 앞의 노드인 3을 빼고 해당 노드의 인접 노드를 방문.

  • 6,7을 방문하고 큐에 넣는다.

5. 큐의 가장 앞의 노드인 4,5,6,7을 차례대로 빼고 인접 노드를 검사하지만 없으므로 실행을 종료함.

저작자표시 (새창열림)

'Skils > Algorithm' 카테고리의 다른 글

투 포인터 알고리즘(Two Pointer)  (0) 2023.03.29
[알고리즘] 다익스트라(Dijkstra)알고리즘?  (0) 2022.08.13
[알고리즘 기말 이론]  (0) 2022.06.15
[알고리즘] Intractability & NP-Theory  (0) 2022.06.13
[알고리즘 기말예제문제] 홀수피라미드(C++)  (0) 2022.06.12
  1. 📕DFS란?
  2. 📕BFS란?
'Skils/Algorithm' 카테고리의 다른 글
  • 투 포인터 알고리즘(Two Pointer)
  • [알고리즘] 다익스트라(Dijkstra)알고리즘?
  • [알고리즘 기말 이론]
  • [알고리즘] Intractability & NP-Theory
재한
재한
안녕하세요 💻
짜이한안녕하세요 💻
재한
짜이한
전체
오늘
어제
  • 분류 전체보기 (504)
    • Skils (118)
      • Android (52)
      • C++ (5)
      • Kotlin (36)
      • Algorithm (24)
      • Server (1)
    • CodingTest (228)
      • Programmers (45)
      • Baekjoon (183)
    • Experience (8)
      • 후기(코딩테스트,프로그램,프로젝트) (8)
    • Computer Science (70)
      • Design Pattern (2)
      • OOP (2)
      • Computer Architecture (14)
      • OS (2)
      • Software Engineering (3)
      • DataBase (8)
      • Network (39)
    • 학교 (75)
      • R프로그래밍 (26)
      • 회계와 사회생활 (17)
      • 컴퓨터학개론 (20)
      • it기술경영개론 (12)

블로그 메뉴

  • 홈
  • 태그
  • 카테고리
  • 글쓰기
  • 설정

인기 글

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
재한
[알고리즘] DFS & BFS
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.