문제
https://www.acmicpc.net/problem/15553
풀이(15분)
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.*
fun main() {
val br = BufferedReader(InputStreamReader(System.`in`))
var st: StringTokenizer
// 첫 줄에서 N(구간의 개수), K(묶을 개수)를 입력받음
st = StringTokenizer(br.readLine())
val N = st.nextToken().toInt()
val K = st.nextToken().toInt()
var cnt = N
val pq = PriorityQueue<Int>() // 간격을 오름차순으로 저장할 우선순위 큐
// 사람이 1인 경우 바로 출력
if (N == 1) {
println(1)
return
}
// 첫 번째 위치 입력
val start = br.readLine().toInt()
var last = start
var max = N // 기본 길이 (각 구간의 최소 길이 1로 가정)
// 중간 위치들 입력받으며 간격 계산
repeat(N - 2) {
val next = br.readLine().toInt()
pq.add(next - (last + 1)) // 간격 저장
last = next
}
// 마지막 위치 입력
val end = br.readLine().toInt()
pq.add(end - (last + 1))
// N개의 구간을 K개로 묶기 위해 (N-K)개의 간격을 합침
while (cnt > K) {
max += pq.poll() // 가장 짧은 간격부터 더함
cnt--
}
// 결과 출력
println(max)
}
문제 풀이 전략
- 모든 구간의 간격 계산
→ 입력받은 위치들 사이의 거리(간격)를 구해 우선순위 큐(PriorityQueue)에 저장한다. - 가장 짧은 간격부터 묶기
→ N개의 구간을 K개로 만들기 위해 (N - K)개의 간격을 합쳐야 하므로,
간격이 작은 것부터 차례로 꺼내 합친다. - 최종 길이 계산
→ 기본적으로 각 구간의 최소 길이 1을 더하고,
합쳐진 간격들의 길이를 더해 최종 결과를 출력한다.
'문제 풀이 > 백준' 카테고리의 다른 글
| [백준] Ezreal 여눈부터 가네 ㅈㅈ(Kotlin) (0) | 2025.10.28 |
|---|---|
| [백준] 17352번. 여러분의 다리가 되어드리겠습니다!(Kotlin) (0) | 2025.10.28 |
| [백준] 16924번. 십자가 찾기(Kotlin) (0) | 2025.10.22 |
| [백준] 24392번. 영재의 징검다리(Kotlin) (0) | 2025.10.21 |
| [백준] 4779번. 칸토어 집합(Kotlin) (0) | 2025.10.16 |