[C++] 백준 15720 - 카우버거

메르센고수·2023년 8월 7일
0

Baekjoon

목록 보기
8/48
post-thumbnail

문제 - 카우버거 (Silver 5)

[백준 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;
}

결과

결론

  • 힌트를 유심히 보면 헛짓거리를 하지 않아도 된다.
  • vector와 for 반복문을 너무 많이 사용하고 있어서 코드 길이를 줄일 겸 간단하게 해볼 필요가 있을 것 같다. (이 코드보다 더 간단하게 풀 수 있을 것 같아서)
profile
블로그 이전했습니다 (https://phj6724.tistory.com/)

0개의 댓글