Hanbit the Developer
[Prefix Sum] Python - 백준 3020번: 개똥벌레 본문
import sys
input = sys.stdin.readline
N, H = map(int, input().split())
bottomObstacles = [0]*H
topObstacles = [0]*H
for i in range(N//2):
o1, o2 = int(input()), int(input())
bottomObstacles[o1-1] += 1
topObstacles[o2-1] += 1
bottomPrefixSum = [0]*(H+1)
topPrefixSum = [0]*(H+1)
for i in range(H-1, -1, -1):
bottomPrefixSum[i] = bottomPrefixSum[i+1] + bottomObstacles[i]
topPrefixSum[i] = topPrefixSum[i+1] + topObstacles[i]
minObstaclesToBeDestroyed, minCount = 400001, 0
for b, t in zip(range(H), range(H-1, -1, -1)):
cur = bottomPrefixSum[b] + topPrefixSum[t]
if cur == minObstaclesToBeDestroyed:
minCount += 1
elif cur < minObstaclesToBeDestroyed:
minObstaclesToBeDestroyed = cur
minCount = 1
print(minObstaclesToBeDestroyed, minCount)
이번 풀이에서는 prefix sum 알고리즘이 핵심이다.
우선, bottomObstacles, topObstacles으로 나누어서 해당 높이에 해당하는 장애물의 갯수를 따로 기록해준다.
bottomPrefixSum[i]에는 해당 높이(i: 0~H-1)에서 충돌하게 될 장애물들의 갯수를 기록하는데, 이것은 for문을 H-1에서 0까지 역순으로 돌면서 prefix를 구해주면 된다. topPrefixSum은 역으로 저장한다.
두 prefix sum의 값을 합치면 해당 위치에서의 장애물의 갯수가 된다. 이 때, topPrefixSum은 역순으로 저장되어 있으므로, for문의 인덱스값을 조절해준다. 아무튼 그렇게 장애물 갯수들의 최소값을 구해주고, 최소값과 현재 i 높이에서의 장애물 갯수가 같을 경우에는 minCount를 증가시켜준다.
'Algorithm > 백준' 카테고리의 다른 글
[Python] 백준 1753번: 최단경로 (0) | 2021.04.18 |
---|---|
[Python] 백준 1065번: 한수 (0) | 2021.04.16 |
[문자열] Python - 12904번, A와 B (0) | 2021.04.14 |
[그리디] Python - 11497번, 통나무 건너뛰기 (0) | 2021.04.12 |
[그래프] Python - 2252번, 줄 세우기 (0) | 2021.04.11 |