https://www.acmicpc.net/problem/2212
2212번: 센서
첫째 줄에 센서의 개수 N(1 ≤ N ≤ 10,000), 둘째 줄에 집중국의 개수 K(1 ≤ K ≤ 1000)가 주어진다. 셋째 줄에는 N개의 센서의 좌표가 한 개의 정수로 N개 주어진다. 각 좌표 사이에는 빈 칸이 하나 있
www.acmicpc.net
접근방법
저번에 풀었던 행복유치원과 같은 문제이다.
예제 2번을 보면서 한번 살펴보자.
10
5
10 5 20 3 14 6 7 8 18 10 12 15
해당 센서를 오름차순으로 정렬하면 다음과 같다.
3 6 7 8 10 12 14 15 18 20
이 세선들을 몇 개씩 묶어서 총 K개의 묶음으로 만들면 된다.
이때, 문제의 핵심은 센서 사이의 거리가 짧은 것을 위주로 선택해야한다.
예를 들어 센서의 거리가 다음같다고 하자.
3 1 1 2 2 2 1
위 센서간 거리에서 짧은 것끼리 묶어야 센서간 거리의 최소값을 만들 수 있다.
3보단 1인 것들을 묶어야 최소로 만들 수 있다.
예를 들어, [ 3 ] [ 1 1 ] [ 2 2 ] [ 2 1 ] 이런 식으로 묶는 것이
[ 3 1 ] [ 1 2] [ 2 2 ] [ 1 ] 보다 더 작은 값을 가질 수 있다. (2 + 4 + 3 vs 4 + 3 + 4)
다시 예제로 돌아와서 생각해볼 것은 여러 개를 포함하는 집중국은 몇 개이어야 하는가? 이다.
센서간 거리가 긴 것은 하나의 집중국이 관리하는 것이 효율적이다.
이를 잘 생각해보면, n개의 센서 중 k개는 하나의 집중국이 관리해야한다는 말이다.
정리하자면
1. 센서간 거리가 긴 것은 하나의 집중국이 관리해야 한다.
2. 그러기 위해선, 센서간 거리가 짧은 센서들을 묶어서 집중국이 관리해야 한다.
3. 따라서, 하나의 센서만 관리하는 집중국이 최대일 개수는 k개이다.
코드
#include <iostream>
#include <vector>
#include <algorithm>
#include <stack>
#include <string>
#include <cmath>
#define MAX 9
using namespace std;
int n, k;
vector<int> num;
vector<int> gap;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> k;
for (int i = 0; i < n; i++) {
int tmp;
cin >> tmp;
num.push_back(tmp);
}
sort(num.begin(), num.end());
for (int i = 0; i < n - 1; i++) {
int tmp = num[i + 1] - num[i];
gap.push_back(tmp);
}
sort(gap.begin(), gap.end());
int sum = 0;
for (int i = 0; i < gap.size() && i < n - k; i++) {
sum += gap[i];
}
cout << sum;
}
함께보기
https://parvegoongame.tistory.com/123
[그리디 #13] BOJ 13164 - 행복 유치원
https://www.acmicpc.net/problem/13164 13164번: 행복 유치원 입력의 첫 줄에는 유치원에 있는 원생의 수를 나타내는 자연수 N(1 ≤ N ≤ 300,000)과 나누려고 하는 조의 개수를 나타내는 자연수 K(1 ≤ K ≤ N)가
meteorfish.blog
'📊알고리즘 > BOJ' 카테고리의 다른 글
BOJ 16987 - 계란으로 계란치기 (0) | 2024.02.28 |
---|---|
[그리디 #21] BOJ 7570 - 줄 세우기 (0) | 2024.02.27 |
[백트래킹 #1] BOJ 15649 - N과 M (1) (0) | 2024.02.23 |
[그리디 #19] BOJ 2812 - 크게 만들기 (1) | 2024.02.23 |
[그리디 #18] BOJ 11000 - 강의실 배정 (0) | 2024.02.22 |