DFS 깊이 우선 탐색 알고리즘

2021. 3. 31. 11:40·알고리즘 공부/BFS & DFS

DFS 깊이 우선 탐색 알고리즘

특정한 경로로 탐색하다가 특정한 상황에서 최대한 깊숙이 들어가서 노드를 방문한 후,

다시 돌아가 다른 경로로 탐색하는 알고리즘

 

1) 탐색 시작 노드를DFS 깊이 우선 탐색 알고리즘

 

특정한 경로로 탐색하다가 특정한 상황에서 최대한 깊숙이 들어가서 노드를 방문한 후,

 

다시 돌아가 다른 경로로 탐색하는 알고리즘

 

 

 

1) 탐색 시작 노드를 스택에 삽입하고 방문 처리를 한다.

2) 스택의 최상단 노드에 방문하지 않은 인접 노드가 있으면 그 인접 노드를 스택에 넣고 "방문 처리"한다.

방문하지 않은 인접 노드가 없으면 스택에서 최상단 노드를 꺼낸다.

3) 2) 번의 과정을 더이상 수행할 수 없을 때까지 반복한다."

 

여기서 "방문처리" 는 스택에 한 번 삽입되어 처리된 노드가 다시 삽입되지 않게 체크하는 것을 의미한다.

방문 처리를 함으로써 각 노드를 한 번씩만 처리할 수 있다.(개인적으로 가장 유용하다 생각)

 

# DFS 함수 정의
def dfs(graph, v, visited):
    # 현재 노드를 방문 처리
    visited[v] = True
    print(v, end=' ')
    # 현재 노드와 연결된 다른 노드를 재귀적으로 방문
    for i in graph[v]:
        if not visited[i]: 방문하지 않았을 때
            dfs(graph, i, visited) <---- 재귀함수



# 각 노드가 연결된 정보를 리스트 자료형으로 표현(2차원 리스트)
graph = [
  [],
  [2, 3, 8],
  [1, 7],
  [1, 4, 5],
  [3, 5],
  [3, 4],
  [7],
  [2, 6, 8],
  [1, 7]
]

# 각 노드가 방문된 정보를 리스트 자료형으로 표현(1차원 리스트)
visited = [False] * 9

# 정의된 DFS 함수 호출
dfs(graph, 1, visited)

결과 1 2 7 6 8 3 4 5 

 

위와 같은 알고리즘은 재귀함수를 사용했다.

 

<출처> 이 것이 코딩 테스트다 <나동빈 지음>

반응형

'알고리즘 공부 > BFS & DFS' 카테고리의 다른 글

[백준] 1012번 유기농 배추 - 파이썬  (0) 2021.08.18
[백준] 2606번 단지번호붙이기 - 파이썬  (0) 2021.08.17
[백준] 2606번 바이러스 - 파이썬  (0) 2021.08.17
[백준] 1260번 DFS와 BFS- 파이썬  (0) 2021.08.17
BFS "너비 우선 탐색" 알고리즘  (0) 2021.03.31
'알고리즘 공부/BFS & DFS' 카테고리의 다른 글
  • [백준] 2606번 단지번호붙이기 - 파이썬
  • [백준] 2606번 바이러스 - 파이썬
  • [백준] 1260번 DFS와 BFS- 파이썬
  • BFS "너비 우선 탐색" 알고리즘
코딩 코딩 코오딩
코딩 코딩 코오딩
  • 코딩 코딩 코오딩
    코딩하는 누누
    코딩 코딩 코오딩
  • 전체
    오늘
    어제
    • 분류 전체보기 (491)
      • 생산성 (2)
        • 인텔리제이 (2)
      • 프로젝트 기록 (14)
        • git (2)
        • spring (3)
        • TestCode (2)
        • spring security (3)
        • 기타 (2)
        • MySQL (0)
        • Cloud (2)
      • 회고 (4)
      • Spring (6)
      • JPA (0)
      • DB (4)
        • MySql (2)
        • Redis (1)
      • Java (7)
        • JSP (1)
      • 잡담 (1)
      • CS (30)
        • 컴퓨팅 사고 (0)
        • 배열 (4)
        • 알고리즘 (8)
        • 메모리 (7)
        • 자료구조 (9)
        • 암호학 (2)
      • opencv (14)
      • AI (56)
        • 머신러닝 (2)
        • 딥러닝 (7)
        • tensorflow (3)
        • 머신러닝(딥러닝) 정리 (21)
        • 강화학습 (7)
        • 논문 읽기 (1)
        • 잡동사니 (1)
        • python AI (13)
        • 선형대수 (1)
        • 확률론 (0)
      • 알고리즘 공부 (177)
        • 그래프 이론 (0)
        • 다익스트라 (4)
        • 위상정렬 (3)
        • 신장트리-크루스칼 알고리즘 (4)
        • 플로이드 워셜 (3)
        • 이진탐색 (9)
        • 백트래킹 (11)
        • 부르드포스 (9)
        • 다이나믹 프로그래밍 (20)
        • BFS & DFS (24)
        • 그리디 (6)
        • 구현 (15)
        • 정렬 (3)
        • 기타 (62)
        • 수학? (1)
      • 코딩 (173)
        • 파이썬(python) (15)
        • c언어 (13)
        • 프로그래머스 lv1 (46)
        • 프로그래머스 lv2 (41)
        • 백준 - c++ (49)
        • Softeer (9)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    코딩문제
    if문
    코딩기초스킬
    인접행렬
    스택
    알고리즘
    삽입 정렬
    그리디
    캘리브레이션
    소수찾기
    에라토슽네스의 체
    c언어
    코딩기초
    순차 탐색
    n진법 변환
    백준
    C언어 기초
    큐
    코딩
    인접리스트
    BFS
    왜곡보정
    코딩테스트
    정렬
    선택정렬
    자료구조
    프로그래머스
    이미지처리
    DFS
    다이나믹 프로그래밍
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코딩 코딩 코오딩
DFS 깊이 우선 탐색 알고리즘
상단으로

티스토리툴바