백준/그리디

[백준] C++ 13164(행복 유치원)

2zreal 2024. 7. 13. 17:47

 

#include <iostream>
#include <algorithm>

using namespace std;

int arr[300001];
int gap[300001];

int main(void)
{
	int N=0;
	int K=0;
	
	cin>>N>>K;
	
	for(int i=0; i<N; i++)
	{
		cin>>arr[i];
	}
	
	int sum=0;
	
	for(int i=0; i<N-1; i++)
	{
		gap[i]=arr[i+1]-arr[i];
		sum+=gap[i];
	}
	
	sort(gap,gap+(N-1));
	
	for(int i=0; i<K-1; i++)
	{
		sum-=gap[N-2-i];
	}
	
	cout<<sum;
	

	return 0;
}

티셔츠 만드는 비용이 최소가 되도록 K개의 조로 나누었을 때, 티셔츠 만드는 비용을 출력하는 문제이다.

키는 순서대로 주어지고 조에서 키 차이만큼 티셔츠 제작 비용이 든다고 한다.

그리디 하게 접근해 보자.

예제를 보겠다.

키 차이를 나타낸 그림이다.

만약 조의 개수가 1개라면?? 비용은 어떻게 될까??

비용은 9가 된다.

그러면 조의 개수가 2개일 때는 비용은 어떻게 구하지??

여기서 아이디를 떠올려야 한다. 조의 개수가 1개에서 2개가 될 때 비용을 최소로 하는 방법은??

키 차이가 가장 큰 원생을 분리하면 된다.

 

조의 개수가 3개가 되면??

그다음으로 키 차이가 가장 큰 원생을 분리하면 된다.

생각보다 간단한 문제이다.

어떻게 문제를 해결할지 아이디어만 떠올리면 정말 금방 풀 수 있다.

 

풀이 순서

1. 키 차이를 배열에 넣고 정렬한다.

2. 키 차이가 큰 원생끼리 분리시킨다.