코딩 공부 연습

백준 #23559 밥

miffy짱 2022. 1. 25. 15:27
반응형

ICPC 알고리즘 캠프 초급 반을 듣기 시작했는데, 그동안 풀었던 걸 정리를 해보려고 한다.

 

그리디를 이용해서 푸는 문제인데, 이런 유형의 문제들은 다 비슷비슷하게 정렬하면 풀리는 것 같다!

 

vector<pair<int ,int>>, vector<tuple<int, int, int>> 를 정렬의 인자로 compare 함수를 만드는걸 이 문제를 통해 연습해 볼 수 있었다. 원하는 기준으로 정렬할 수 있단 게 참 좋다!

 

문제는 두 학식 메뉴 중 어떤 메뉴를 골라 먹었을 때 만족도가 가장 클지를 구하는 것이다. 다행히 이제 이런 문제는 보면 그리디로 해결하면 되겠다는 감이 온다! skrr

 

tuple로 벡터를 만들고, 3개의 인자를 더 큰 만족도(larger), 더 작은 만족도(smaller), 그리고 5000원만족도-1000원만족도(tmp2 -tmp1) 로 하였다.

 

우선 만족도가 가장 높은 메뉴들로만 매일 학식을 먹는다 가정하고, 예산의 범위를 초과할 경우  예산 범위안으로 들어올 때까지 만족도의 차이가 가장 적은 것 중, 5000원 짜리의 만족도가 1000원의 만족도보다 더 큰 날을 바꿔준다. 

 이렇게 하면 1000원의 만족도가 5000원의 만족도보다 큰 날도 고려하고, 만족도의 차이가 가장 작은 날부터 1000원짜리 학식을 먹기 시작하기 때문에 그리디하게 문제를 풀었다고 할 수 있다!

 

#include<iostream>
#include<string>
#include <map>
#include<set>
#include<stack>
#include <vector>
#include <functional>
#include <algorithm>
#include<cmath>
#include <cstring>
#include <set>
#include <stdio.h>
//#include <string.h>

using namespace std;

long long int x;

bool compare( const tuple<int, int, int> & a, const tuple <int,int, int> &b)
{
    return get<2>(a) > get<2>(b);
}

vector <tuple<int, int, int>> arr;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    int n;
    int tmp1, tmp2;
    cin>> n >>x;
    long long int sum = 0;
    long long int rate =0;
    
    for(int i =0; i< n; i++)
    {
        cin>> tmp1 >>tmp2;
        rate += max(tmp1, tmp2);                   //일단 만족도 합
        int larger, smaller;
        if(tmp1 > tmp2)
        {
            larger  =tmp1; smaller = tmp2;
        }
        else{
            larger = tmp2; smaller =tmp2;
        }
        arr.push_back(make_tuple(larger, smaller,  tmp2-tmp1));
    }
    
    sort(arr.begin(), arr.end(), compare);
    
    for(int i =0; i< n; i++)
    {
        if( get<2>(arr[i]) > 0)
        {
            sum += 1000;
        }
        else
            sum += 5000;
    }
    //일단 무조건 5000원으로 전부 먹는 경우로 시작해서, 금액에 맞게 조절하고, 1000원이 더 만족도가 클때를 본다   
    int i = 0;

    while(sum > x)
    {
        if(get<2>(arr[i]) <= 0)
        {
            sum -= 4000;
            rate += get<2>(arr[i]);
        }
        i++;
    }
    cout<< rate<<'\n';
}