PS(Problem Solving)/BOJ

[백준/BOJ] 2212번: 센서

JunsuKim 2023. 8. 22.
728x90

문제

https://www.acmicpc.net/problem/2212

 

2212번: 센서

첫째 줄에 센서의 개수 N(1 ≤ N ≤ 10,000), 둘째 줄에 집중국의 개수 K(1 ≤ K ≤ 1000)가 주어진다. 셋째 줄에는 N개의 센서의 좌표가 한 개의 정수로 N개 주어진다. 각 좌표 사이에는 빈 칸이 하나 있

www.acmicpc.net

해설

문제를 요약해 보자면, n개의 센서와 k개의 집중국이 있을 때 집중국의 수신 가능영역의 최소 거리 합을 구하는 것이다.

센서는 평면상의 직선에 있으므로, 각 센서의 거리를 구하기 위해 오름차순으로 센서의 위치를 정렬해 준다.

문제의 예시 1을 보면 센서의 위치는 [1, 3, 6, 6, 7, 9]가 된다.

각 센서의 거리 사이는 [2, 3, 0, 1, 2]이 되는 것을 알 수 있다.

센서 사이의 거리를 정렬해 보면 [0, 1, 2, 2, 3]이다.

예시 1에서는 2개의 집중국이 있다고 한다.

 

즉, 가장 거리가 먼 3을 제외시킬 수 있게 된다.

집중국의 개수(k) - 1만큼의 가장 큰 거리를 제외할 수 있는 것이다.

따라서 집중국의 수신 가능영역의 최소 거리합은 0 + 1 + 2 + 2 = 5가 된다.

 

집중국의 개수가 3개라고 가정해 보자.

그렇다면 가장 큰 2개의 거리를 건너뛸 수 있게 된다.

즉, 2가지 경우가 나올 수 있게 된다.

결론적으로 최소 거리합은 0 + 1 + 2로 3이 된다.

코드

fun main() {
    println(solve())
}

private fun solve(): Int {
    val n = readLine()!!.toInt()
    val k = readLine()!!.toInt()
    val list = readLine()!!.split(" ").map { it.toInt() }.sorted()

    if (k >= n) return 0

    val diff = mutableListOf<Int>()
    for (i in 1 until list.size) diff.add(list[i] - list[i - 1])
    diff.sort()
    
    return diff.slice(0 .. diff.size - k).sum()
}
728x90

댓글