3020 개똥벌레 / c++ / Gold5 / 1시간 4분
문제 및 코드

풀이 과정
누적합
- 길이가 N이고 높이가 H인 동굴에 1미터마다 종유석(바닥에서 위로 커지는 돌)과 석순(위에서 아래로 커지는 돌)이 번갈아 등장한다. 한 높이로 일정하게 장애물을 부수며 날아갈 때, 장애물의 최솟값과 그러한 구간의 수를 출력하는 문제.
- 우선 주어진 데이터를 가공한다.
- 여기서는, 번갈아 등장하는 종유석과 석순을 우선 두 벡터로 나눠서, 각각 등장하는 높이(index)와 등장하는 횟수(value)를 저장한다.
- 다음으로 알 수 있는 사실은, 높이가 N일 때, N이상의 높이를 가지는 모든 돌에 부딪히는다는 점이다.
- 따라서 두 벡터를 내림차순으로 순회하며 누적합 연산을 한다. (Vector[N] += Vector [N+1])
- 다음으로 높이를 1부터 H까지 순회하면서 각 높이에 대해 부딪히는 장애물 개수를 구한다.
(이 때 주의해야 할 점은, 종유석 배열은 현재 높이를 그대로 인덱스로 사용해도 되지만, 석순은 [최대 높이 - 현재 높이 + 1] 값을 인덱스로 사용해야 함)
- 만약 현재 장애물의 개수가 기존의 최소값보다 작다면
- 최소값을 갱신
- 구간의 개수도 1로 초기화
- 만약 현재 장애물의 개수가 기존의 최소값과 같다면
- 구간의 개수를 1 증가
- 6번의 순회가 끝난 뒤에 최소값과 그 구간의 개수를 출력
- 해결
회고
- 오랜만에 다시 골드 문제로 넘어왔다. 문제의 유형은 금방 파악했지만, 그림으로 표현하지 않고 머리속으로만 계산했더니 헷갈려서 시간을 오래 소비했다. 다음부터는 그냥 바로 그림으로 그려봐야겠다.
- 처음에 석순에 대한 인덱스 계산을 그냥 [최대 높이 - 현재 높이] 로만 해서 제대로 된 결과값이 나오지 않았었다. 분명 높이 0은 없는데, 이것도 그림으로 표현해보니 바로 해결됐었다.