Koder / 박성훈
article thumbnail

백준 재활 겸 KOI 준비 겸 라이(kks227)님의 알고리즘 강의를 밀고 있다.

그리디 밀면서 오늘 푼 G5.

 

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

 

2212번: 센서

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

www.acmicpc.net

일단

입력을 보고 센서 좌표가 일직선으로 안들어와서 정렬부터 해줬다.

정렬 하고 보니 테스트케이스에서 3과 6 사이에 연결이 없어야 정답이 나오겠다는 생각이 들었다.

왜 3과 6 사이로 직관했나 생각해보니

3과 6사이의 간격이 가장 커서 뺐다는 결론에 도달했고

그래서 간격을 구해서 정렬을 한번 더해줬다.

 

간격 구한거 값 뽑아보니 3 하나 제외하고 나머지 모든 길이를 더하니

정답에서 요구하는 값이 나온다는걸 알아볼수 있었고

K개로 분리하는데 K-1번 끊어줘야하니까 K-1개의 최댓값을 제거해줬다.

제거하면서 전체 간격의 수보다 K가 큰 경우를 만났는데,

이경우엔 그냥 모든 센서에 집중국을 설치해 답이 0이다.

적당히 처리해주자.

 

https://blog.naver.com/kks227/220775134486

 

탐욕적 기법(Greedy Algorithm) (수정: 2019-11-23)

먼저 가장 유명하고 기초적이지만, 입문만 쉽고 마스터는 어려운 그런 녀석들부터 강의하는 것이 좋겠죠.탐...

blog.naver.com

매우 양질의 정보가 많으니까

다들 보면 좋을거같다.

더보기
#include <bits/stdc++.h>
using namespace std;

int pos[12345] = {0};

vector<int> v;

int main(){
	int n,k;
	cin >> n >> k;
	
	for(int i=0; i<n; i++) cin >> pos[i];
	sort(pos,pos+n);
	
	for(int i=1; i<n; i++) v.push_back(pos[i]-pos[i-1]);
	sort(v.begin(), v.end());
	
	
	for(int i=0; i<k-1; i++) if(!v.empty()) v.pop_back();
	
	int ans = 0;
	for(auto node : v){ ans += node; }
	cout << ans;
	return 0;
}

반응형