
이번문제는 설명을 읽으면 상당히 헷갈릴 문제인 것같다. 그렇다면 한번 풀어보자면, 간단한 아이디어를 한번 적어보자
- map에다가 value값으로 특정 크기가 몇인지 저장
- 그 value값을 배열에 넣기
- 배열의 큰값부터 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;
}