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) 출력