컴공생 누르지 마세요! 컴공생 울어요.
[DFS/BFS] DFS/BFS (2) 실전 문제 - 음료수 얼려 먹기 ⭐ 본문
이코테 p.149 실전문제 - 음료수 얼려 먹기
입력
15 14 00000111100000 11111101111110 11011101101110 11011101100000 11011111111111 11011111111100 11000000011111 01111111111111 00000000011111 01111111111000 00011111111000 00000001111000 11111111110011 11100011111111 11100011111111 |
출력
8 |
교재 소스코드
- DFS 이용
- 입력으로 주어진 2차원 리스트를 그래프로 모델링한 후, '0'인 값이 상하좌우로 연결되어 있는 노드 묶음의 개수를 찾으면 됨
- 알고리즘
- 특정한 지점의 주변 상하좌우를 살펴본 뒤, 주변 지점 중에서 값이 '0'이면서 아직 방문하지 않은 지점이 있다면 해당 지점 방문
- 방문한 지점에서 다시 상하좌우를 살펴보면서 방문을 다시 진행하면, 연결된 모든 지점 방문 가능
- 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)
'STUDY > 알고리즘' 카테고리의 다른 글
[정렬] 정렬 (1) 선택 정렬 / 삽입 정렬 (1) | 2023.03.14 |
---|---|
[DFS/BFS] DFS/BFS (3) 실전 문제 - 미로 탈출 ⭐ (1) | 2023.03.13 |
[DFS/BFS] DFS/BFS (1) 개요 (0) | 2023.03.11 |
[구현] 구현 (3) 실전 문제 - 게임 개발 (0) | 2023.03.11 |
[구현] 구현 (2) 실전 문제 - 왕실의 나이트 (0) | 2023.03.11 |
Comments