-
[BOJ 3109, Python 3] 빵집알고리즘/BOJ 2021. 8. 16. 16:29반응형
https://www.acmicpc.net/problem/3109
골드2부터는 본격적으로 다른 스킬을 같이 쓰이는 문제들이 많이보이네요
이 문제는 그리디보다는 DFS에 치중된 문제 같습니다.
풀이
그리디 생각은 아주 간단합니다. 맨 위 좌표부터 확인하여 파이프들의 방향을 맨 위로 가게 우선순위를 설정하거나, 맨 아래 좌표부터 확인하여 맨 아래로 가게 우선순위를 설정하거나 둘 중 하나로 하면 됩니다.
일직선을 우선순위로 하면 안되는 이유, 맨 아래에서는 맨 아래 좌표부터 확인하고 맨 위에서는 맨 위 좌표부터 확인해야 하는 이유는 먼저 풀이를 설명하고 말하겠습니다.
이렇게 그리디적인 생각을 했으면 이제 DFS를 해주면 됩니다. 이때 주의할 점은 방문한 지점은 이제 더 이상 방문할 필요가 없으니 막아둬야 합니다.
왜냐하면 만약 파이프 라인을 만들 수 있으면 거긴 이제 파이프를 설치해서 벽으로 막는 것은 당연한 일입니다. 그리고 파이프 라인을 만들 수 없으면 해당 좌표로 움직여 DFS를 하는 것은 어차피 파이프 라인을 만들 수 없고 시간낭비만 하니까 막아둬야 합니다.
그래서 파이프 라인을 만들 수 있을 때와 없을 때 전부 더 이상 방문할 수 없도록 막아둬야 한다는 것을 알 수 있습니다.
일직선을 우선순위로 하면 안된다는 이유는 일직선으로 막아버리면 대각선으로 이동하여 파이프라인을 만들 수 있던 것도 못 만들게 하기 때문에 최적해를 구할 수가 없게 됩니다.
그리고 맨 위 좌표부터 확인하면 맨 위 방향을 우선순위로 하는 이유는 위쪽부터 확인해주면 DFS를 하는 동안 위쪽 공간이 비어있을 수도 있기 때문에 그렇습니다. 맨 아래 좌표부터 확인하면 맨 아래 방향을 우선순위로 하는 이유도 마찬가지 입니다.
코드
1234567891011def go(x, y):arr[x][y] = 'x'if y == c - 1: return 1for nx in [x-1, x, x+1]:if 0 <= nx < r and arr[nx][y+1] == '.' and go(nx, y+1): return 1return 0input = __import__('sys').stdin.readliner, c = map(int, input().split())arr = [[*input().strip()] for _ in range(r)]print(sum(go(i, 0) for i in range(r)))cs 반응형'알고리즘 > BOJ' 카테고리의 다른 글
[BOJ 1135, Python 3] 뉴스 전하기 (0) 2021.08.17 [BOJ 17619, Python 3] 개구리 점프 (0) 2021.08.17 [BOJ 10775, Python 3] 공항 (0) 2021.08.16 [BOJ 1781, Python 3] 컵라면 (0) 2021.08.16 [BOJ 1202, Python 3] 보석 도둑 (0) 2021.08.15