입력
첫째 줄에 센서의 개수 N(1 ≤ N ≤ 10,000), 둘째 줄에 집중국의 개수 K(1 ≤ K ≤ 1000)가 주어진다. 셋째 줄에는 N개의 센서의 좌표가 한 개의 정수로 N개 주어진다. 각 좌표 사이에는 빈 칸이 하나 있으며, 좌표의 절댓값은 1,000,000 이하이다.
출력
첫째 줄에 문제에서 설명한 최대 K개의 집중국의 수신 가능 영역의 길이의 합의 최솟값을 출력한다.
처음 방식은
정렬 후 원래 하려던 건 값을 정렬한 후에 index 0부터 비교를 해서 차이가 일정하면 패스하고 차이가 달라지면
거기에 기지국을 세우고 기지국이 너무많아지면
다시 비교후 저장된 차이값에 +1만큼해서 기지국 또 세우고 이런식으로 접근했는데
+1만큼 세웠을때 차이가 불규칙하며 어떻게 비교를 해야할지 몰라서 막혔다.
두번째 방식
정렬을 한후 각값의 차이만큼 또 정렬을 하게된다면
차이가 적은 값부터 정렬이 될 텐데
그럼 차이가 제일작은순으로 센서-기지국 값만큼 더해주면 답이된다.
기지국에서 센서들을 할당을 하는데
센서들에게 수신을 받는값은 센서-기지국(n-k)이다.
n-k가 나온 이유는
센서의 간격은 총 n-1개인데 기지국이 n-1개의 간격을
k개로 나눴을 때 버려지는 간격이 k-1개이므로
우리가 사용하는 간격의 갯수는 총 n-1 - (k-1) = n-k이다.
#include<iostream> //3
#include<vector>
#include<algorithm>
using namespace std;
vector<int> inputN; //입력값 받고 정렬할 벡타
vector<int> differ; //정렬된 값들을 넣고 정렬할 벡터
void input(int& sensors, int& manages) { //입력값 받는 함수
int temp=0;
cin >> sensors >> manages;
for (int i = 0; i < sensors; i++) {
cin >> temp;
inputN.push_back(temp);
}
}
void solution(int& sensors, int& manages) { //답 도출 함수
int ans = 0;
sort(inputN.begin(),inputN.end()); //들어온 값 정렬
for (int i = 1; i < inputN.size(); i++) {
differ.push_back(inputN[i] - inputN[i - 1]); //differ 벡터에 정렬된 두 값 차이 다 push
}
sort(differ.begin(), differ.end()); //각 차이를 또 정렬한 후
for (int i = 0; i < sensors - manages; i++) { //0부터 sensors- manages까지 값을 다 더한것이 답.
ans += differ[i];
}
cout << ans;
}
int main() {
int sensors = 0, manages = 0;
input(sensors,manages);
solution(sensors,manages);
}
정렬되고 그 차이값을 또 정렬하는 기술은 생각하지 못했다. 차이값이 달라지는 곳을 체크할 수 있는 스킬을 배운 것 같다.
와 너 진짜 멋지다. 자기가좋아하는 분야를 꾸준히 해나간다는게 정말 어려운건데. 넌 그런걸 해내고있네. 나도 꼭 너와 비슷한 사람이될거야! 둘다 열심히 노력해서 서로에게 긍정적인 영향을 주는 사람이되자! 공부로도, 인간적으로도! 오늘도 수고했어!!😉