[백준 15720] https://www.acmicpc.net/problem/15720
처음에 문제 조건에 있는 힌트를 간과하고 정렬하지 않은 상태에서 Set Menu 가격을 계산해서 잘못된 결과가 출력되었었다. 하지만, 힌트를 자세히 보면 첫번째 Set와 두번째 Set가 버거, 사이드 메뉴, 음료수를 오름차순으로 정렬한 뒤, 가격 순서대로 Set를 구성하고 있다는 것을 알 수 있다. 따라서 정렬을 한 뒤 계산을 할 것이다.
[힌트]
입력 예에 나온 메뉴들의 가격을 모두 합하면 12100원이다.
- 첫 번째 세트는 3000원짜리 버거, 1300원짜리 사이드메뉴, 1000원짜리 음료로 구성하면 5300 * 0.9 = 4770원이다.
- 두 번째 세트는 2500원짜리 버거, 1000원짜리 사이드메뉴, 500원짜리 음료로 구성하면 4000 * 0.9 = 3600원이다.
- 남은 2000원짜리 버거와 800원짜리 사이드메뉴는 음료가 없으므로 세트 할인을 받을 수 없다. 따라서 세트 할인이 적용된 후의 최소 가격은 4770+3600+2800 = 11170원이 된다.
#include <iostream>
#include <algorithm> // 정렬을 하기 위함
#include <vector>
using namespace std;
int main(void){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int B,S,D;
cin>>B>>S>>D;
vector<int> burger(B,0);
vector<int> side(S,0);
vector<int> drink(D,0);
vector<int> SetMenu; // 세트 메뉴를 저장할 배열
vector<int> Individual; // 단품 (세트 할인 X)을 저장할 배열
int total=0;
for(int i=0;i<B;i++){
cin>>burger[i];
total+=burger[i];
}
for(int i=0;i<S;i++){
cin>>side[i];
total+=side[i];
}
for(int i=0;i<D;i++){
cin>>drink[i];
total+=drink[i];
}
sort(burger.begin(), burger.end(),greater<int>());
sort(side.begin(), side.end(),greater<int>());
sort(drink.begin(), drink.end(),greater<int>());
//버거,사이드 메뉴, 음료수를 오름차순으로 정렬
int min_sets = min({B, S, D});
/*입력한 B,S,D 중에 가장 작은 값을 min_set으로 저장
(min_set까지 세트 메뉴를 구성할 수 있기 때문에)*/
for (int i = 0; i < min_sets; i++) {
int setPrice=(burger[i] + side[i] + drink[i]) * 0.9;
//세트 할인
SetMenu.push_back(setPrice);
}
for (int i = min_sets; i < B; i++) {
Individual.push_back(burger[i]);
}
for (int i = min_sets; i < S; i++) {
Individual.push_back(side[i]);
}
for (int i = min_sets; i < D; i++) {
Individual.push_back(drink[i]);
}
// 단품 메뉴를 Individual 배열에 저장
int setTotal=0;
for(int price:SetMenu){
setTotal+=price;
} // 세트메뉴가격을 setTotal에 저장
for(int idv:Individual){
setTotal+=idv;
} // 단품의 가격을 setTotal에 저장
cout<<total<<'\n'<<setTotal<<'\n';
return 0;
}