Programming/알고리즘 & 코테
[DFS/BFS] 음료수 얼려 먹기 (실전문제, 이것이 코딩테스트다 with 파이썬)
kk_______yy
2023. 12. 18. 15:58
DFS (깊이 우선 탐색 알고리즘)
: 깊이 우선 탐색, 그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘
BFS (너비 우선 탐색 알고리즘)
: 너비 우선 탐색, 가까운 노드부터 탐색하는 알고리즘
문제
해설
DFS 유형 : 얼음을 얼릴 수 있는 공간이 상, 하, 좌, 우로 연결 → 그래프 형태로 모델링
ex)
001
010
101
이라는 예시에 대해서 다음의 그래프로 모델링 할 수 있다.
'0' 으로 상, 하, 좌, 우 연결된 노드를 묶으면 다음의 세 묶음이 나온다.
묶음을 찾아주는 프로그램을 DFS로 작성할 수 있다.
1. 특정한 노드의 주변 상, 하, 좌, 우를 살펴본 뒤, 주변 노드 중에서 값이 '0'이면서 방문하지 않은 노드가 있다면 방문
2. 방문한 노드에서 다시 상, 하, 좌, 우를 살펴보면서 방문 재진행 → 연결된 모든 노드 방문
3. 1~2 과정을 모든 노드에 반복하여 방문한 지점의 수 세기
풀이
# 변수 : N 틀 세로길이, M 틀 가로길이
# N, M을 공백으로 구분하여 입력받기
n, m = map(int, input().split())
# 변수 : graph 틀의 구멍 정보 리스트
# 2차원 리스트의 맵 정보 입력받기
graph = []
for i in range(n):
graph.append(list(map(int, inpur())))
# 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, 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) # 정답 출력
해석
변수 : N M 틀의 세로 가로 크기, graph 틀의 정보, result 만들 수 있는 아이스크림 개수
1. 틀의 크기(N, M) 입력받기
2. 틀의 정보(graph) 입력받기
3. DFS 함수 정의
ㄴ 범위 벗어남 : return False
ㄴ 방문하지 않은 노드 : 방문 처리 & 상하좌우 노드 재귀적 호출 → return True, result += 1
ㄴ 방문한 노드 : return False
4. DFS 함수로 모든 노드 방문
ㄴ 함수 결과 True이면 result += 1
5. 만들 수 있는 아이스크림 개수(result) 출력