[프로그래머스 C++] 귤 고르기

 

https://school.programmers.co.kr/learn/courses/30/lessons/138476

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


 

 

해결전략

 

맵 Map

정렬


 

코드

 

#include <string>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;

bool Compare(pair<int,int>& a, pair<int,int>& b)
    return a.second > b.second;

int solution(int k, vector<int> tangerine) {
    int answer = 0;
    
    map<int, int> myMap;

    //myMap의 key에 주어진 배열의 숫자, value에 0 값으로 등록
    for (const auto& i : tangerine)
        myMap[i] = 0;

    //주어진 숫자가 중복인 경우 카운팅하여 myMap의 value를 업데이트
    for (const auto& i : tangerine)
        myMap[i]++;

    //배열을 생성하여 myMap의 key와 value값을 pair<int,int>로 넣어준다.
    vector<pair<int, int>> v;
    for (auto it = myMap.begin(); it != myMap.end(); it++)
        v.push_back({it->first, it->second});

    //value값이 많은(=중복된 숫자가 많은) 순서로 정렬한다.
    sort(v.begin(), v.end(), Compare);
    
    //k에서 중복된 숫자가 많은 것들부터 차례대로 빼준다.
    //뺀 숫자를 카운팅한다. answer++
    //k가 0이하가 되면 for문을 끝낸다.
    for(int i=0; i<v.size(); i++)
    {
        if (k > 0) {
            k -= v[i].second;
            answer++;
        }
        else
            break;
    }

    return answer;
}