컴공생 누르지 마세요! 컴공생 울어요.

[DFS/BFS] DFS/BFS (2) 실전 문제 - 음료수 얼려 먹기 ⭐ 본문

STUDY/알고리즘

[DFS/BFS] DFS/BFS (2) 실전 문제 - 음료수 얼려 먹기 ⭐

당도최고치악산멜론 2023. 3. 11. 21:47

이코테 p.149 실전문제 - 음료수 얼려 먹기

입력

15 14
00000111100000
11111101111110
11011101101110
11011101100000
11011111111111
11011111111100
11000000011111
01111111111111
00000000011111
01111111111000
00011111111000
00000001111000
11111111110011
11100011111111
11100011111111

출력

8

교재 소스코드

  • DFS 이용
  • 입력으로 주어진 2차원 리스트를 그래프로 모델링한 후, '0'인 값이 상하좌우로 연결되어 있는 노드 묶음의 개수를 찾으면 됨
  • 알고리즘
    1. 특정한 지점의 주변 상하좌우를 살펴본 뒤, 주변 지점 중에서 값이 '0'이면서 아직 방문하지 않은 지점이 있다면 해당 지점 방문
    2. 방문한 지점에서 다시 상하좌우를 살펴보면서 방문을 다시 진행하면, 연결된 모든 지점 방문 가능
    3. 1~2번 과정을 모든 노드에 반복하며 방문하지 않은 지점의 수를 세기
# 입력받기
N, M = map(int, input().split())

# 2차원 리스트의 맵 정보 입력받기
graph = []
for i in range(N):
  graph.append(list(map(int, input())))

# DFS로 특정한 노드를 방문한 뒤, 연결된 모든 노드들 방문
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)
    dfs(x + 1, y)
    dfs(x, y - 1)
    dfs(x, y + 1)
    return True
  return False

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

print(res)
Comments