BOJ

백준 2212 - 센서

yanJuicy 2019. 6. 30. 17:07
반응형

문제

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

 

2212번: 센서

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

www.acmicpc.net

 

풀이

K개의 집중국을 K개의 직선으로 바꿔서 생각하면 쉽게 해결이 가능한 문제이다. 수신 가능영역 거리의 최소는 센서 사이 직선의 최소 길이로 바꿔 생각하면 된다.

 

N개의 센서들을 정렬하고 인접한 센서 사이의 거리를 구하고 다시 정렬하여 큰 거부터 K - 1개 제거해주면 된다. 예제

 1 6 9 3 6 7의 경우 1 3 6 6 7 9로 정렬이 되고 인접한 거리는 다시 2 3 0 1 2가 된다. 여기서 가장 길이가 긴 직선인 3을 제거하면, 두개의 기지국 중에서 한 개의 기지국은 2만큼 수신하고 나머지 한 개의 기지국 0+1+2 만큼 수신하면 된다. 따라서 길이가 가장 긴 거리부터 삭제하면 최소의 거리를 구할 수 있다.

 

 

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <algorithm>
using namespace std;
 
int sensor[10000];
int dist[999];
int result;
 
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(false);
 
    int N, K;
    cin >> N >> K;
 
    for (int i = 0; i < N; i++)
        cin >> sensor[i];
 
    sort(sensor, sensor + N);
 
    // 인접한 센서 사이의 거리
    for (int i = 0; i < N - 1; i++)
        dist[i] = sensor[i + 1- sensor[i];
 
    // 거리 내림차순 정렬
    sort(dist, dist + (N - 1), greater<int>());
 
    // 거리가 먼 순서대로 삭제
    for (int i = 0; i < K - 1; i++) dist[i] = 0;
 
    for (int i = 0; i < N - 1; i++) result += dist[i];
 
    cout << result;
 
    return 0;
}
 
cs

 

반응형

'BOJ' 카테고리의 다른 글

백준 2309 - 일곱 난쟁이  (0) 2019.07.03
백준 13904 - 과제  (1) 2019.07.02
백준 1182 - 부분수열의 합  (0) 2019.06.29
백준 1699 - 제곱수의 합  (0) 2019.06.25
백준 2294 - 동전 2  (0) 2019.06.24