[백준/BOJ] 백준 1049번 : 기타줄

2020. 6. 12. 15:41알고리즘 문제풀이

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

 

1049번: 기타줄

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

www.acmicpc.net

패키지 가격과 낱개 가격을 입력받아 각각 오름차순으로 정렬해 패키지에서 가격이 가장 작은 것과, 낱개에서 가격이 가장 작은 것 만을 이용한다.

앞으로 사야될 기타 줄을  패키지로 사는 것이 좋을지 낱개로 사는 것이 좋을지 현재의 개수 상황에 맞게 파악해 값을 지불하는 것을 반복해서 사야 될 기타 줄을 줄여가며, 앞으로 사야 될 기타 줄이 0 이하로 된다면 더 이상 기타 줄을 살 필요가 없으므로 반복을 종료하고 지금까지 지불한 값을 출력한다.

 

코드

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);

	int n, m;
	vector<int> pack;
	vector<int> item;
	int temp1, temp2;
	int minvalue = 0;

	cin >> n >> m;

	for (int i = 0; i < m; i++)
	{
		cin >> temp1 >> temp2;
		pack.push_back(temp1);
		item.push_back(temp2);
	}

	sort(pack.begin(), pack.end()); //패키지 가격을 오름차순으로 정렬
	sort(item.begin(), item.end()); //낱개 가격을 오름차순으로 정렬

	while (n > 0)
	{
		//살것이 6개 이하로 남았을때
		if (n <= 6)
		{
			if (pack[0] > item[0] * n)
			{
				minvalue += item[0] * n;
				n -= n;
			}

			else
			{
				minvalue += pack[0];
				n -= 6;
			}
		}

		//살것이 6개 초과로 남았을때
		else
		{
			if (pack[0] > item[0] * 6)
			{
				minvalue += item[0] * 6;
				n -= 6;
			}

			else
			{
				minvalue += pack[0];
				n -= 6;
			}
		}

	}

	cout << minvalue;

	return 0;
}