김호쭈
DevForYou
김호쭈
전체 방문자
오늘
어제
  • 분류 전체보기 (321)
    • • 데이터베이스(DB) (9)
      • __SQL__ (9)
    • •알고리즘(Algorithm ) (117)
      • 문제풀이 (99)
      • 스터디 (14)
      • 알고리즘 팁 (4)
    • •Compter Science (57)
      • Operating System (25)
      • Computer Network (1)
      • Computer Vision (16)
      • Artificial Intelligence (14)
      • Software Technology (1)
    • • 독서 (36)
      • Design Pattern (24)
      • 객체지향의 사실과 오해 (1)
      • Object Oriented Software En.. (11)
    • • 개발 (26)
      • React (3)
      • node.js (6)
      • Django (11)
      • Spring boot (6)
    • • 개발Tip (4)
      • GitHub (0)
    • •프로젝트 (2)
      • 물물 (2)
    • •App (54)
      • 안드로이드 with Kotlin (50)
      • 코틀린(Kotiln) (4)
    • •회고 (8)
    • •취준일기 (3)
    • • 기타 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Remote저장소
  • 로컬저장소
  • local저장소
  • KMU_WINK
  • 깃허브데스크탑
  • ㄱ
  • 원격저장소
  • GitHubDesktop

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
김호쭈

DevForYou

[알고리즘] DFS(깊이 우선 탐색) 파이썬
•알고리즘(Algorithm )/스터디

[알고리즘] DFS(깊이 우선 탐색) 파이썬

2022. 7. 27. 02:55
 

[알고리즘] BFS(넓이 우선탐색) 파이썬 구현 , 파이썬으로 그래프 노드 표현하기

# 내용 그래프에서 많이쓰이는 넓이 우선탐색 방법(BFS) 시작 노드로부터 갈 수 있는 노드들을 차례로 방문예정 큐에 넣은 후, 방문완료 큐에 넣는다. 방문예정큐로부터 뽑아 방문하지 않았다면,

devforyou.tistory.com

 

# 내용

BFS와 같이 탐색을 하지만, DFS는 말 그대로 깊이 우선탐색이다. 노드들을 계속 타고 타고 타고 들어가는 것이라고 생각하면 된다.

재귀함수로도 구현이 가능하다는 생각이 들었다. 근데 재귀로 짜면 끝에서부터 찾아오는 느낌이 될거 같다. 물론 구현은 가능하겠지만, 적합하지는 않을거 같다는 생각이 들었다.

BFS와 매우 유사하지만, 방문해야할 노드들을 스택으로 표현하냐 큐로 표현하냐에 따라서 달라진다. 

스택으로 표현하는 이유는 간단하다. 내가 깊숙한 곳 까지 들어갔는데, 다시 뒤돌아갈 곳을 알아야 하기 때문이라고 생각하면 쉽다. 마치 빵조각을 하나씩 떨어뜨리면서 이동하다가 갈 길이 없으면 다시 빵을 주으면서 돌아온길을 찾아가는 것이다.

 

# 사용된 그래프

# 코드

# DFS ( 깊이 우선탐색 )

def make_graph() :
  graph = dict()
  graph["A"] = ["B","C","D"]
  graph["B"] = ["A","E"]
  graph["C"] = ["A"]
  graph["D"] = ["A","F","G"]
  graph["E"] = ["B","H"]
  graph["F"] = ["D","I","J"]
  graph["G"] = ["D"]
  graph["H"] = ["E"]
  graph["I"] = ["F"]
  graph["J"] = ["F"]
  print(f"make OK {graph}")
  return graph

def dfs(graph,start_node) :
  queue_visited = list()
  stack_will_visit = list()
  # 뽑기 -> 인접노드 방문예정 스택에 추가 -> 방문표시
  cur_node = start_node
  stack_will_visit.extend(graph[cur_node])
  queue_visited.append(cur_node)

  while stack_will_visit :
    cur_node = stack_will_visit.pop()
    print(f"queue_visited : {queue_visited}",end="")
    print(f" stack_will_visit : {stack_will_visit}",end="")
    print(f" cur_node : {cur_node}")
    if cur_node not in queue_visited :
      stack_will_visit.extend(graph[cur_node])
      queue_visited.append(cur_node)
  return queue_visited


if __name__ == '__main__':
  graph = make_graph()
  answer = dfs(graph,"A")
  print(answer)

 

# 참고

 

# .

내가 알고리즘이나 자료구조를 심도있게 공부해본게 아니지만, 지금까지는 학교 수업에 맞춰야 했기때문에 C++로 풀고 구현했었는데, 이게 파이썬으로 하니까 정말 신세계다. 자잘한 것을 신경 안써도 되는 느낌이다.

최고👍

 

저작자표시 (새창열림)

'•알고리즘(Algorithm ) > 스터디' 카테고리의 다른 글

[알고리즘] 크루스칼(Kruskal) 알고리즘 파이썬, 최소신장트리(MST), union-find기법(union-by-rank, path-compression)  (0) 2022.07.30
[알고리즘] 다익스트라(Dijkstra Algorithm) 알고리즘 파이썬, 최소힙(min-heap) 사용하기  (0) 2022.07.28
[알고리즘] BFS(넓이 우선탐색) 파이썬 구현 , 파이썬으로 그래프 노드 표현하기  (0) 2022.07.27
[알고리즘] 순차탐색 파이썬 시간복잡도  (0) 2022.07.26
[알고리즘] 이진탐색 파이썬 및 시간복잡도  (0) 2022.07.26
    '•알고리즘(Algorithm )/스터디' 카테고리의 다른 글
    • [알고리즘] 크루스칼(Kruskal) 알고리즘 파이썬, 최소신장트리(MST), union-find기법(union-by-rank, path-compression)
    • [알고리즘] 다익스트라(Dijkstra Algorithm) 알고리즘 파이썬, 최소힙(min-heap) 사용하기
    • [알고리즘] BFS(넓이 우선탐색) 파이썬 구현 , 파이썬으로 그래프 노드 표현하기
    • [알고리즘] 순차탐색 파이썬 시간복잡도
    김호쭈
    김호쭈
    공부하고 정리하고 기록하기

    티스토리툴바