Algorithm

주요 알고리즘(3)-DFS/BFS

정도윤 2024. 5. 15. 21:44
  • DFS

깊이 우선 탐색, 그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘이다.

 

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

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

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

3. 1,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)
graph=[[], #2차원 리스트 자료형으로 표현
      [2,3,8], #1번 노드 연결 정보
      [1,7], #2번 노드 연결 정보
      [1,4,5],
      [3,5],
      [3,4],
      [7],
      [2,6,8],
      [1,7]
      ]
visited=[False]*9

dfs(graph,1,visited)

 

  • BFS

너비우선탐색, 가까운 노드부터 탐색하는 알고리즘으로 선입선출 방식인 큐 자료구조를 이용하는 것이 정석

 

1.탐색 시작 노드를 큐에 삽입하고 방문 처리

2. 큐에서 노드를 꺼내 해당 노드의 인접노드중 방문 하지 않은 노드를 모두 큐에 삽입하고 방문 처리

3. 1,2,번과정을 수행할 수 없을 때 까지 반복

 

 

from collections import deque  #queue사용을 위한 모듈


def bfs(graph, start, visited): #BFS 메서드 정의
    queue = deque([start]) #큐 구현을 위해 deque 사용
    visited[start] = True #방문한 노드를 True로 변경
    while queue: # 큐가 빌때까지 방문 처리
      v=queue.popleft() #큐에서 원소하나 뽑아서 출력
      print(v, end=' ')
      for i in graph[v]: #해당 원소와 연결되고
        if not visited[i]: #방문 하지 않은 원소
          queue.append(i) #큐에 삽입
          visited[i]=True

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

visited=[False]*9

 

bfs(graph, 1, visited)

 


  • 음료수 얼려 먹기

NXM의 얼음 틀이 있고 구멍이 뚫린부분은 0, 칸막이가 있는 부분은 1로

구멍이 뚫린부분이 상,하,좌,우 로 붙어있는 경우 서로 연결되어있는것으로 간주한다.

얼음 틀 모양을 입력받고 생성될 수 있는 총 아이스크림의 개수를 구하시오

 

n, m = map(int, input().split())

graph = []
for _ in range(n):
  graph.append(list(map(int, input())))

def dfs(x, y):
  if x<=-1 or x>=n or y<=-1 or y>=m:
    return False
  if graph[x][y] == 0:
    graph[x][y] = 1
    dfs(x-1, y) #왼쪽 탐색 'L'
    dfs(x, y-1) #아래 탐색 'D'
    dfs(x+1, y) #오른쪽 탐색 'R'
    dfs(x, y+1) #위쪽 탐색 'U'
    return True
  return False

result = 0
for i in range(n):
  for j in range(m):
    dfs(i,j)
    if dfs(i, j) == True:
      result +=1

print(result)