프로그래머스 링크
https://school.programmers.co.kr/learn/courses/30/lessons/138476
문제 설명
경화는 과수원에서 귤을 수확했습니다. 경화는 수확한 귤 중 'k'개를 골라 상자 하나에 담아 판매하려고 합니다. 그런데 수확한 귤의 크기가 일정하지 않아 보기에 좋지 않다고 생각한 경화는 귤을 크기별로 분류했을 때 서로 다른 종류의 수를 최소화하고 싶습니다.
예를 들어, 경화가 수확한 귤 8개의 크기가 [1, 3, 2, 5, 4, 5, 2, 3] 이라고 합시다. 경화가 귤 6개를 판매하고 싶다면, 크기가 1, 4인 귤을 제외한 여섯 개의 귤을 상자에 담으면, 귤의 크기의 종류가 2, 3, 5로 총 3가지가 되며 이때가 서로 다른 종류가 최소일 때입니다.
경화가 한 상자에 담으려는 귤의 개수 k와 귤의 크기를 담은 배열 tangerine이 매개변수로 주어집니다. 경화가 귤 k개를 고를 때 크기가 서로 다른 종류의 수의 최솟값을 return 하도록 solution 함수를 작성해주세요.
제한사항
- 1 ≤ k ≤ tangerine의 길이 ≤ 100,000
- 1 ≤ tangerine의 원소 ≤ 10,000,000
입출력 예ktangerineresult
6 | [1, 3, 2, 5, 4, 5, 2, 3] | 3 |
4 | [1, 3, 2, 5, 4, 5, 2, 3] | 2 |
2 | [1, 1, 1, 1, 2, 2, 2, 3] | 1 |
입출력 예 설명
입출력 예 #1
- 본문에서 설명한 예시입니다.
입출력 예 #2
- 경화는 크기가 2인 귤 2개와 3인 귤 2개 또는 2인 귤 2개와 5인 귤 2개 또는 3인 귤 2개와 5인 귤 2개로 귤을 판매할 수 있습니다. 이때의 크기 종류는 2가지로 이 값이 최소가 됩니다.
입출력 예 #3
- 경화는 크기가 1인 귤 2개를 판매하거나 2인 귤 2개를 판매할 수 있습니다. 이때의 크기 종류는 1가지로, 이 값이 최소가 됩니다.
코드 풀이
1. 크기와 개수를 저장할 map생성 (vector로 하면 어마어마한 메모리를 할당할 거 같아서 map으로 구현)
2. map에 크기에 맞는 개수를 저장
3. 사실적으로 필요한 값은 map에 저장된 개수이다
Count를 저장할 vector 변수 생성 후 Count값 저장(reserve로 미리 메모리 할당)
4. 가장 높은 개수부터 처리해야하므로 내림차순 정렬(개수가 많은것 부터 처리해야 서로 다른 종류가 최소가 됨)
5. 반복문 돌면서 answer 값 ++
코드
#include <string>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
int solution(int k, vector<int> tangerine) {
int answer = 0;
// 크기, 개수를 저장할 맵 변수를 생성
map<int, int> mSave;
int Size = static_cast<int>(tangerine.size());
// 사이즈만큼 돌면서 크기에 맞는 개수 증가
for(int i = 0; i < Size; ++i)
{
mSave[tangerine[i]]++;
}
// 맵에 저장된 개수를 저장할 벡터 변수를 저장 후 reserve로 메모리 할당
vector<int> vecCount;
vecCount.reserve(mSave.size());
// 개수 데이터 저장
for(auto Pair : mSave)
{
vecCount.push_back(Pair.second);
}
// 내림차순 정렬(개수가 많은것부터 저장해야 서로 다른 종류가 최소가 나오게 됨)
sort(vecCount.begin(), vecCount.end(), greater<int>());
int Count = 0;
int vecSize = vecCount.size();
for(int i = 0; i < vecSize; ++i)
{
if(Count >= k)
break;
++answer;
Count += vecCount[i];
}
return answer;
}
'프로그래머스 > lv2' 카테고리의 다른 글
프로그래머스 : 연습문제 > 뒤에 있는 큰 수 찾기(lv2) c++ (0) | 2023.06.04 |
---|---|
프로그래머스 : Summer/Winter Coding(~2018) > 스킬트리(lv2) c++ (0) | 2023.06.03 |
프로그래머스 : 2021 카카오 채용연계형 인턴십 > 숫자 문자열과 영단어(lv2) c++ (0) | 2023.05.28 |
프로그래머스 : Summer/Winter Coding(~2018) > 방문 길이(lv2) c++ (0) | 2023.05.19 |
프로그래머스 : 2019 카카오 개발자 겨울 인턴십 > 튜플(lv2) c++ (0) | 2023.05.07 |
댓글