본문 바로가기
Algorithm

DFS/BFS - 음료수 얼려 먹기, 미로탈출

by shur_ 2024. 3. 7.

음료수 얼려먹기

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) #True or False
        dfs(x, y-1)
        dfs(x+1, y)
        dfs(x, y+1)
        return True
    return False

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

graph = []
for i in range(n):
    graph.append(list(map(int, input())))
    
result = 0
for i in range(n):
    for j in range(m):
        if dfs(i, j) == True:
            result += 1
            
print(result)

 

DFS를 재귀적으로 나타냈다.

기초적인 부분이 부족해서 이해가 안됐는데

함수안에 있는 함수 즉 재귀함수에 관한 것과 함수의 종료 조건에 관한 것이었다.

dfs()안에 있는 dfs()의 결과로 True/False가 나올 뿐 함수는 종료되지 않는다는 점과 for문에서 수행한 dfs()에서 하나의 값만이 나온다는 점이다.

 


미로탈출

from collections import deque

def bfs(x,y) :
    queue = deque()
    queue.append((x,y))
    
    while queue:
        x, y = queue.popleft()
        
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            
            if nx < 0 or nx >= n or ny < 0 or ny >= m:
                continue
            
            if graph[nx][ny] == 0:
                continue
            
            if graph[nx][ny] == 1 :
                graph[nx][ny] = graph[x][y] + 1
                queue.append((nx, ny))
                
    return graph[n-1][m-1]

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

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

# 이동할 네 가지 방향 정의
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

print(bfs(0,0))

 

미로를 탈출하기 위해 움직여야 하는 최소 칸의 개수를 구하는 문제.

즉 최소 거리를 구하는 문제다.

각 그래프 노드에 출발 지점부터의 거리를 저장하는 idea.

이동할 방향(상, 하, 좌, 우)을 리스트로 미리 만들어 놓고 써먹는 idea.

 

각 좌표에서 상하좌우로 탐색을 진행하면서 이웃 노드가 나아갈 수 있는 길이라면(1) 이전 노드까지의 거리에 +1을 하여 해당 노드에 저장하는 방식으로 진행한다.

'Algorithm' 카테고리의 다른 글

삽입 정렬  (0) 2023.12.18
선택 정렬  (0) 2023.12.17
시간복잡도  (1) 2023.12.06
DFS, BFS  (1) 2023.10.12
그리디 알고리즘  (0) 2023.10.06

댓글