PS/그리디 알고리즘[Greedy]

1049 기타줄(c++)

SeungbeomKim 2022. 7. 21. 19:48
반응형

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

 

1049번: 기타줄

첫째 줄에 N과 M이 주어진다. N은 100보다 작거나 같은 자연수이고, M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 M개의 줄에는 각 브랜드의 패키지 가격과 낱개의 가격이 공백으로 구분하여 주

www.acmicpc.net

<코드>

#include <iostream>
#include <algorithm>
#include <vector>
#include <utility>
using namespace std;
bool cmp(pair<int,int>p1,pair<int,int>p2)
{
	return p1.first<p2.first;
}
bool cmp2(pair<int,int>p3,pair<int,int>p4)
{
	return p3.second<p4.second;
}
int main()
{
	int n,m;
	cin>>n>>m;
	vector<pair<int,int>>v;
	for(int i=0;i<m;i++)
	{
		int p,a; //패키지, 낱개
		cin>>p>>a; 
		v.push_back(make_pair(p,a));
	}
	
	
	int ans1 = 0;
	int ans2 = 0;
	int cnt=0;
	// 끊어진 기타줄 수가 6개보다 작을때 
	if(n<6) 
	{
		sort(v.begin(),v.end(),cmp); // 패키지를 기준으로 오름차순 정렬 
		int result = v[0].first;
		for(int i=0;i<m;i++)
		{
			if(v[i].second*n<result) //(낱개 * 개수)의 가격  < 패키지의 가격 
			{
				result = (v[i].second*n); // 변경 
			}
		}
		cout<<result;
	}
	
	else 
	{
		sort(v.begin(),v.end(),cmp); // 패키지를 기준으로 오름차순 정렬 
		if(n%6==0)
		{
			ans2 += (v[0].first * (n/6)); // 끊어진 기타줄 수가 6의 배수이면  
		}
		else
		{
			ans2 += (v[0].first * ((n/6)+1)); // 끊어진 기타줄 수가 6의 배수가 아니면 ex) 6 13일 때, 패키지 3개를 구입해야 한다. 
		}
		//패키지와 낱개를 모두 구매할 경우 
		while(cnt<n){
				ans1 += v[0].first; //패키지의 합 
				cnt+=6; 
				if(n-cnt<6) break;  
		}
		sort(v.begin(),v.end(),cmp2); // 낱개를 기준으로 오름차순 정렬 
		ans1 += (v[0].second*(n-cnt)); //낱개의 합 
		int min_result = min(ans2,ans1); // 낱개 + 패키지와 패키지와 비교해 더 작은 것이 최소가 된다. 
		// 낱개만 구매한 경우  
		if(min_result>v[0].second*n)  
		cout<<v[0].second*n<<'\n';
		else
		cout<<min_result<<'\n';
	}

}

<풀이과정>

*주석 참고* 

반응형

'PS > 그리디 알고리즘[Greedy]' 카테고리의 다른 글

백준 1781 컵라면(c++)  (0) 2022.07.21
백준 1049 기타줄(c++)  (0) 2022.07.21
1202 보석 도둑(c++)  (0) 2022.07.20
백준 19598 최소 회의실(c++)  (0) 2022.07.20
백준 13975 파일 합치기 3(c++)  (0) 2022.07.19