Doby's Lab

백준 15720번: 카우버거 (C++) 본문

PS/BOJ

백준 15720번: 카우버거 (C++)

도비(Doby) 2022. 6. 19. 15:00

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

 

15720번: 카우버거

첫째 줄에는 주문한 버거의 개수 B, 사이드 메뉴의 개수 C, 음료의 개수 D가 공백을 사이에 두고 순서대로 주어진다. (1 ≤ B, C, D ≤ 1,000) 둘째 줄에는 각 버거의 가격이 공백을 사이에 두고 주어진

www.acmicpc.net


Solved By: Greedy Algorithm

 

세트가 만들어질 수 있는 최대의 개수를 minv라고 하겠습니다. 버거에서 minv개까지 내림차순으로 비용에 0.9를 곱합니다.

 

왜냐하면 세트로 만들었을 때, 어떠한 경우에도 다른 값에 할인을 했다가는 최솟값을 가질 수 없기 때문에 가장 큰 값에 0.9를 곱하여 다 더해주는 것이 맞습니다. => 그리디 알고리즘인 이유

 

버거와 음료, 사이드 모두 마찬가지이기 때문에 같은 과정을 거칩니다.

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

int b, c, d;
vector<int> B, C, D;

bool cmp(int a, int b) {return a > b;}

int main(){
    cin >> b >> c >> d;
    int minv = min(min(b, c), d);
    
    int sum = 0;
    
    for(int i = 0; i < b; i++){
        int v; cin >> v; B.push_back(v);
        sum += v;
    }
    for(int i = 0; i < c; i++){
        int v; cin >> v; C.push_back(v);
        sum += v;
    }
    for(int i = 0; i < d; i++){
        int v; cin >> v; D.push_back(v);
        sum += v;
    }
    
    sort(B.begin(), B.end(), cmp);
    sort(C.begin(), C.end(), cmp);
    sort(D.begin(), D.end(), cmp);
    
    for(int i = 0; i < minv; i++){
        B[i] *= 0.9;
        C[i] *= 0.9;
        D[i] *= 0.9;
    }
    
    int sum2 = 0;
    for(int i = 0; i < b; i++) sum2 += B[i];
    for(int i = 0; i < c; i++) sum2 += C[i];
    for(int i = 0; i < d; i++) sum2 += D[i];
    
    cout << sum << '\n' << sum2;
    return 0;
}

 

728x90