첫째 줄에 R과 C가 주어진다. (1 ≤ R ≤ 10,000, 5 ≤ C ≤ 500) 다음 R개 줄에는 빵집 근처의 모습이 주어진다. '.'는 빈 칸이고, 'x'는 건물이다. 처음과 마지막 열은 항상 비어있다.
출력
첫째 줄에 원웅이가 놓을 수 있는 파이프라인의 최대 개수를 출력한다.
입력 예시
5 5
.xx..
..x..
.....
...x.
...x.
출력 예시
2
풀이
그리디 문제. 그리디는 '어떤 최적의 전략을 적용할 것인가?'가 문제 풀이의 핵심이 되어야 한다. 여기서는 비교적 쉬운 전략을 적용해 볼 수 있을 것 같다. 첫째 행(제일 위)부터 마지막 행(제일 아래)까지 순차적으로 탐색을 진행한다고 가정하자. 파이프를 마지막 열까지 이을 때 가급적 위쪽 행으로 이어지도록 이어보는 것이 핵심이다. 즉 이를 위해서는 DFS로 진행하며 오른쪽 위-오른쪽-오른쪽 아래 순으로 탐색하는 전략이 요구된다. 이 경우 최대 10000 * 500의 연산 내에 모든 순회가 가능하다.
풀이 코드
import sys
input = sys.stdin.readline
dy = [-1, 0, 1]
R, C = map(int, input().split())
map_list = [input().strip() for _ inrange(R)]
visited = [[False]*C for _ inrange(R)]
defdfs(idx, y) :
if idx == C - 1 :
returnTruefor k inrange(3) :
ay = y + dy[k]
if -1 < ay < R and map_list[ay][idx+1] != 'x'andnot visited[ay][idx+1] :
visited[ay][idx+1] = True
is_enable = dfs(idx+1, ay)
if is_enable :
returnTruereturnFalse
result = 0for r inrange(R) :
visited[r][0] = True
is_enable = dfs(0, r)
if is_enable :
result += 1print(result)