5. DFS/BFS - 예제) 음료수 얼려먹기

Yona·2021년 9월 30일
0

algorithm_study

목록 보기
6/6

문제 이해

N * M 크기의 얼음 틀이 있다.
구멍이 뚫린 부분은 0, 칸막이가 있는 부분은 이다.

00110
00011
11111
00000

일 경우 아이스크림이 3개 생성된다.

해결방식

DFS!

  1. 특정 지점의 주변 상,하,좌,우 를 살펴본 뒤에, 주변 지접 중에서 값이 0이면서 아직 방문하지 않은 지점이 있다면 해당 지점을 방문한다.
  2. 방문한 지점에서 다시 상,하,좌,우를 살펴보면서 방문을 다시 진행하면 연결된 모든 지점을 방문할 수 있다.
  3. 1~2과정을 모든 노드에 반복하며 방문하지 않은 지점의 수를 센다.

예제 코드

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

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

# DFS
def DFS(x, y) :
  stack = []
  # 주어진 범위를 벗어나는 경우 즉시 종료
  if x <= -1 or x >= n or y <= -1 or y >= m :
    return False
  # 현재 노드를 아직 방문하지 않았다면
  if graph[x][y] == 0 :
    # 해당 노드 방문 처리
    # 상 하 좌 우 위치도 모두 재귀적으로 호출
    dfs(x-1, y)
    dfs(x, y-1)
    dfs(x+1, y)
    dfs(x, y+1)
    return True
  return False

# 모든 노드에 대하여 음료수 채우기
result = 0
for i in range(n) :
  for j in range(m) :
    # 현재 위치에서 DFS 수행
    if DFS(i, j) == True :
      result += 1

print(result)
profile
Sometimes you win, sometimes you learn 🏃‍♀️

0개의 댓글