[Algorithme] 귤 고르

gunggme·2024년 1월 8일

알고리즘

목록 보기
39/42

시작

이번문제는 설명을 읽으면 상당히 헷갈릴 문제인 것같다. 그렇다면 한번 풀어보자면, 간단한 아이디어를 한번 적어보자

  1. map에다가 value값으로 특정 크기가 몇인지 저장
  2. 그 value값을 배열에 넣기
  3. 배열의 큰값부터 k를 빼서 0이 되도록 하기

이런식으로 하면 문제가 풀린다. 그렇다면 코드 하나하나를 설명을 해보자. 우선 map에 개수를 저장하는 코드 부터 한번 알아보도록 하자

	int answer = 0, max = 0;
    map<string, int> tangs;
    vector<int> tangsValue;
    // 맵에다가 개수 넣어놓기
    for (int i = 0; i < tangerine.size(); i++) {
        tangs[to_string(tangerine[i])]++;
        // 최대 크기 구해놓기
        if (max < tangerine[i]) {
            max = tangerine[i];
        }
    }

우선 맵에는 key, value값을 원칙으로 한다. 그렇기에 <int, int>값이 아닌 <string, int>값으로 지정해준 뒤에 나중을 위한 최대크기를 저장해놓는다.

int sum = 0;
    // 만약 map에 저장이 되어있다면 배열에 넣기
    for (int i = 0; i <= max; i++) {
        string iNum = to_string(i);
        if (tangs[iNum]) {
            tangsValue.push_back(tangs[iNum]);
        }
    }
    // 내림차순 정렬
    sort(tangsValue.begin(), tangsValue.end(), desc);

그러고 나서 이제 0부터 시작해서 큰 크기의 값까지 value값을 가져오고 그 값들을 배열에 넣고, 내림차순으로 정렬을 한다. 그 이유는 가장 큰 값부터 사용해야 답을 구할 수 있기 때문에 내림차순으로 정렬을 한다.

// 큰수 부터 줄여나가기
    for (int i = 0; i < tangsValue.size(); i++) {
        k -= tangsValue[i];
        answer++;
        if (k <= 0) {
            break;
        }
    }

큰 수 부터 줄여나가 0 이하가 될때까지 빼고, answer은 1씩 더해 답을 구하면 풀리게 된다.

코드

#include<iostream>
#include<string>
#include <vector>
#include <algorithm>
#include <map>

using namespace std;

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

int solution(int k, vector<int> tangerine) {
    int answer = 0, max = 0;
    map<string, int> tangs;
    vector<int> tangsValue;
    // 맵에다가 개수 넣어놓기
    for (int i = 0; i < tangerine.size(); i++) {
        tangs[to_string(tangerine[i])]++;
        // 최대 크기 구해놓기
        if (max < tangerine[i]) {
            max = tangerine[i];
        }
    }
    int sum = 0;
    // 만약 map에 저장이 되어있다면 배열에 넣기
    for (int i = 0; i <= max; i++) {
        string iNum = to_string(i);
        if (tangs[iNum]) {
            tangsValue.push_back(tangs[iNum]);
        }
    }
    // 내림차순 정렬
    sort(tangsValue.begin(), tangsValue.end(), desc);

	// 큰수 부터 줄여나가기
    for (int i = 0; i < tangsValue.size(); i++) {
        k -= tangsValue[i];
        answer++;
        if (k <= 0) {
            break;
        }
    }
    return answer;
}
profile
안녕하세요!

0개의 댓글