문제
한국도로공사는 고속도로의 유비쿼터스화를 위해 고속도로 위에 N개의 센서를 설치하였다. 문제는 이 센서들이 수집한 자료들을 모으고 분석할 몇 개의 집중국을 세우는 일인데, 예산상의 문제로, 고속도로 위에 최대 K개의 집중국을 세울 수 있다고 한다.
각 집중국은 센서의 수신 가능 영역을 조절할 수 있다. 집중국의 수신 가능 영역은 고속도로 상에서 연결된 구간으로 나타나게 된다. N개의 센서가 적어도 하나의 집중국과는 통신이 가능해야 하며, 집중국의 유지비 문제로 인해 각 집중국의 수신 가능 영역의 길이의 합을 최소화해야 한다.
편의를 위해 고속도로는 평면상의 직선이라고 가정하고, 센서들은 이 직선 위의 한 기점인 원점으로부터의 정수 거리의 위치에 놓여 있다고 하자. 따라서, 각 센서의 좌표는 정수 하나로 표현된다. 이 상황에서 각 집중국의 수신 가능영역의 거리의 합의 최솟값을 구하는 프로그램을 작성하시오. 단, 집중국의 수신 가능영역의 길이는 0 이상이며 모든 센서의 좌표가 다를 필요는 없다.
입력
첫째 줄에 센서의 개수 N(1 ≤ N ≤ 10,000), 둘째 줄에 집중국의 개수 K(1 ≤ K ≤ 1000)가 주어진다. 셋째 줄에는 N개의 센서의 좌표가 한 개의 정수로 N개 주어진다. 각 좌표 사이에는 빈 칸이 하나 있으며, 좌표의 절댓값은 1,000,000 이하이다.
출력
첫째 줄에 문제에서 설명한 최대 K개의 집중국의 수신 가능 영역의 길이의 합의 최솟값을 출력한다.
풀이
개인적으로 이해가 안가서 여러번 읽었던 문제이다
문제를 적지 않게 접했다고 생각하는데 이처럼 문제부터 이해하기 힘든 경우를 아주 드물게 만나는 것 같다
문해력이 문제인건지.. 문제가 불친절한건지..
1. 센서를 정렬한다
2. 센서 사이의 거리들을 저장한다
3. 센서 사이의 거리를 정렬한다
4. 집중국의 개수-1개 만큼 멀리 떨어진 센서의 거리들을 제거한다
5. 남은 센서 사이의 거리를 합친다
여기서 핵심은 4. 인데,
집중국의 개수가 3개라고 가정하면 센서를 총 3관할로 나눠서 관리할 수 있다
따라서 [ 1관할 ] [ 2관할 ] [ 3관할 ] 일 때, 센서 사이의 거리 2개를 무시할 수 있게 된다
그래서 거리가 먼 센서 순으로 제거하면 된다
# 센서
import sys
input = sys.stdin.readline
N = int(input())
K = int(input())
sensors = list(map(int,input().split()))
distance = []
sensors.sort()
for idx in range(N-1):
distance.append(sensors[idx+1]-sensors[idx])
distance.sort()
for _ in range(K-1):
if distance:
distance.pop()
print(sum(distance))
참고로 k가 n보다 큰 경우도 있으니 고려해줘야한다
'알고리듬 > Greedy' 카테고리의 다른 글
[백준 31926] 밤양갱 (1) | 2024.11.14 |
---|---|
[백준 2847] 게임을 만든 동준이 (0) | 2024.11.12 |
[백준 13417] 카드 문자열 (0) | 2024.11.12 |
[백준 14916] 거스름돈 (0) | 2024.11.11 |
[백준 27961] 고양이는 많을수록 좋다 (0) | 2024.11.09 |