김호쭈
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)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

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

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
김호쭈

DevForYou

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

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

2022. 7. 27. 02:27

# 내용

그래프에서 많이쓰이는 넓이 우선탐색 방법(BFS)

시작 노드로부터 갈 수 있는 노드들을 차례로 방문예정 큐에 넣은 후, 방문완료 큐에 넣는다.

방문예정큐로부터 뽑아 방문하지 않았다면, 해당 노드에서 갈 수 있는 노드들을 뽑고, 방문완료 큐에 넣는 과정을 계속해서 반복하며, 더이상 방문할 노드가 없으면 끝이다.

 

파이썬에서는 그래프를 딕셔너리로 편하게 표현 할 수 있다. 

큐를 사용해도 되고, 파이썬의 강력한 list를 사용해 큐처럼 활용 가능하다.

파이썬의 리스트가 제공하는 extend를 사용하면 리스트를 맨뒤에 연장시켜준다.

 

# 사용 그래프

 

# 코드

# bfs ( 넓이 우선 탐색 )

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 bfs(graph,start_node) :
  # 큐 초기화
  queue_visited = list()
  queue_will_visit = list()

  # 시작노드
  cur_node = start_node
  # 시작노드와 연결된 노드 큐에 추가
  queue_will_visit.extend(graph[cur_node])
  # 방문 완료
  queue_visited.append(cur_node)

  while queue_will_visit :
    print(f"queue_visited : {queue_visited}",end="")
    print(f" queue_will_visit : {queue_will_visit}",end="")
    print(f" cur_node : {cur_node}")

    # 방문해야할 노드 하나 뽑음
    cur_node = queue_will_visit.pop(0)
    # 방문한 기록이 없다면
    if cur_node not in queue_visited :
      # 방문해야하는 노드들 기록
      queue_will_visit.extend(graph[cur_node])
      # 방문 완료
      queue_visited.append(cur_node)

  return queue_visited


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

 

# 시간복잡도

시간복잡도는 Vertex(노드) + Edge(간선)의 합이다.

while문이 V(ertex) + E(dge) 만큼 돈다는 의미이다.

 

O(V+E)

저작자표시 (새창열림)

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

[알고리즘] 다익스트라(Dijkstra Algorithm) 알고리즘 파이썬, 최소힙(min-heap) 사용하기  (0) 2022.07.28
[알고리즘] DFS(깊이 우선 탐색) 파이썬  (0) 2022.07.27
[알고리즘] 순차탐색 파이썬 시간복잡도  (0) 2022.07.26
[알고리즘] 이진탐색 파이썬 및 시간복잡도  (0) 2022.07.26
[알고리즘] 병합정렬(merge-sort) 파이썬  (0) 2022.07.24
    '•알고리즘(Algorithm )/스터디' 카테고리의 다른 글
    • [알고리즘] 다익스트라(Dijkstra Algorithm) 알고리즘 파이썬, 최소힙(min-heap) 사용하기
    • [알고리즘] DFS(깊이 우선 탐색) 파이썬
    • [알고리즘] 순차탐색 파이썬 시간복잡도
    • [알고리즘] 이진탐색 파이썬 및 시간복잡도
    김호쭈
    김호쭈
    공부하고 정리하고 기록하기

    티스토리툴바