[이코테] 4.1 DFS/BFS 실전문제

음료수 얼려먹기


DFS문제로 매우 자주 출제되는 유형

2차원 배열 형태의 구역을 주고 해당 구역을 나누거나 구역의 개수를 세거나 하는 유형

import sys

def dfs(x, y):
    # 인덱스를 벗어 났으면 (배열 인덱스 주의)
    if x < 0 or y < 0 or x >= N 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

N, M = map(int, sys.stdin.readline().split())
graph = list()
for i in range(N):
    # readline 사용 시 rstrip 을 사용하여 \n을 제거한다
    graph.append(list(map(int, sys.stdin.readline().rstrip())))

# 탐색 시작
answer = 0

for i in range(N):
    for j in range(M):
        if dfs(i, j) is True:
            answer += 1
print(answer)

미로 탈출


BFS는 가까운 노드부터 차례대로 그래프의 모든 노드를 탐색한다. 따라서 해당 문제는 BFS를 적용하면 유리하다.

import sys
from collections import deque

# 방향을 골라서 움직여야 할 때 리스트형태로 사용
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

def bfs(x, y):
    queue = deque()
    queue.append((x, y))
    # queue 가 비어있을 때까지
    while queue:
        x, y = queue.popleft()
        # 상하좌우 탐색
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            # 인덱스 범위 밖이라면
            if nx < 0 or ny < 0 or nx >= N or ny >= M:
                continue
            # 괴물이 있거나 방문 이력이 있거나
            if graph[nx][ny] == 0 or graph[nx][ny] > 1:
                continue
            # 갈 수 있는 길이라면
            queue.append((nx, ny))   # 큐에 삽입
            graph[nx][ny] = graph[x][y] + 1
    return graph[-1][-1]

N, M = map(int, sys.stdin.readline().split())
graph = list()
for i in range(N):
    graph.append(list(map(int, sys.stdin.readline().rstrip())))
print(bfs(0, 0))