알고리즘 문제풀이
[백준/BOJ] 백준 1049번 : 기타줄
GeniusJo
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;
}