최대 1 분 소요

Problem

https://www.acmicpc.net/problem/3109

Idea

왼쪽 끝열에서 오른쪽 끝열까지 경로가 중복되지 않고 연결될 수 있는 파이프의 갯수를 구하는 문제이다. 왼쪽 열의 가장 윗 행부터 아래 행까지 파이프를 연결해보았을 때, 최대의 파이프라인 수는 결국 모든 파이프라인이 상단으로 밀착해야 얻을 수 있다. 오른쪽 위 대각선, 오른쪽, 오른쪽 아래 대각선의 순서로 깊이 우선 탐색을 하여 탐색이 오른쪽 끝열까지 도달했을 경우 탐색을 종료하고 파이프라인의 갯수를 하나 더해주었다.

Code

import sys
from collections import deque

def dfs(y, x):
    stack = deque()
    stack.append((y, x))
    
    while stack:
        cur_y, cur_x = stack.pop()
        visited[cur_y][cur_x] = True
        if cur_x == C-1:
            return 1
        
        for i in range(3):  # dfs로 대각선 위, 오른쪽, 대각선 아래 순으로 탐색하도록 함.
            # 좌측 상단에서부터 탐색을 시작할 때 파이프라인이 최대한 상단으로 붙는 것이 한 파이프라인이 차지하는 공간이 적어지므로.
            next_y, next_x = cur_y+dy[i], cur_x+1
            if 0 <= next_y < R and world[next_y][next_x] == '.' and visited[next_y][next_x] == False:
                stack.append((next_y, next_x))
            
    return 0
        
input = sys.stdin.readline

R, C = map(int, input().split())
world = [input().rstrip() for _ in range(R)]
    
visited = [[False for _ in range(C)] for _ in range(R)]
dy = [1, 0, -1]
sol = 0

for i in range(R):
    sol += dfs(i, 0)
    
print(sol)

Comment

태그: , ,

카테고리:

업데이트: