https://www.acmicpc.net/problem/1449
1449번: 수리공 항승
첫째 줄에 물이 새는 곳의 개수 N과 테이프의 길이 L이 주어진다. 둘째 줄에는 물이 새는 곳의 위치가 주어진다. N과 L은 1,000보다 작거나 같은 자연수이고, 물이 새는 곳의 위치는 1,000보다 작거나
www.acmicpc.net
난이도 : 실버 3
태그 : 그리디, 정렬
설명
1, 2, 3, 4 위치에서 물이 흐르고, 길이가 3인 테이프가 있다고 할 때,
위치 1을 테이프를 막기 위해 0.5 ~ 2.5 까지 덮을 수 있습니다.
하지만 위치가 3인 곳은 고치지 못하기에,
위치 3을 막기 위해 2.5 ~ 4.5 까지 덮을 수 있습니다.
즉, 물이 새는 곳의 위치를 오름차순 정렬한 뒤,
가장 처음 물이 떨어지는 곳의 위치를 테이프로 막고,
방금 전에 붙인 테이프로 막을 수 없는 곳이 나온다면 또 다시 테이프를 막는 작업을 반복하면 됩니다.
소스코드
import java.util.PriorityQueue
fun main() = with(System.`in`.bufferedReader()) {
val (n, l) = readLine().split(" ").map(String::toInt)
val pq = PriorityQueue<Double>()
pq.addAll(readLine().split(" ").map { it.toDouble() })
var ans = 0
var len = 0.0
while (pq.isNotEmpty()) {
val e = pq.poll()
if (e > len) {
len = e + l - 0.5
ans++
}
}
println(ans)
}
len은 이전에 붙인 테이프의 끝 위치를 저장합니다.
직전에 테이프의 끝 위치보다 큰 위치가 나오면,
(현재 물이 새는 곳 위치 + 테이프 길이 - 0.5)로 갱신시키며,
테이프를 뜯은 횟수 (ans)를 +1 해줍니다.
'코딩테스트 > Kotlin' 카테고리의 다른 글
[백준 17135번] [Kotlin] 캐슬 디펜스 (0) | 2023.12.08 |
---|---|
[백준 2589번] [Kotlin] 보물섬 (0) | 2023.12.01 |
[백준 14719번] [Kotlin] 빗물 (1) | 2023.11.30 |
[백준 2503번] [Kotlin] 숫자 야구 (0) | 2023.11.29 |
[백준 11508번] [Kotlin] 2+1 세일 (0) | 2023.11.24 |