컴굥일지
[Programmers/프로그래머스 lv2][C++] 귤 고르기 본문
반응형
문제
https://school.programmers.co.kr/learn/courses/30/lessons/138476
문제 내용
한 상자에 담으려 하는 귤의 개수 k와, 귤의 크기를 담은 배열 tangerine을 입력받는다.
귤의 개수 k개를 채우되, 귤의 크기의 종류가 최소가 되게 하는 크기의 개수를 구하면 된다.
문제 풀이
k개를 채울 때 귤 크기의 종류를 최소화시켜야 할 뿐, 특정 크기의 귤을 모두 사용해서 k개를 채우는 문제가 아니다.
이 부분을 잘못 생각해서 한참을 고민해야 했다.
k개를 채울 때 귤 크기의 종류를 최소화시키려면, 귤이 가장 많은 크기부터 사용하면 된다.
그럼 각 크기별로 귤이 몇 개인지를 구해야 한다.
나는 위 내용을 이분 탐색을 사용하여 풀었다.
upper_bound와 lower_bound를 적절히 잘 조합하면 특정 원소의 개수를 구할 수 있다. (반드시 정렬하고 진행해야 함)
위 함수를 통해 귤 크기별 개수를 tangerineSize 벡터에 추가하고, 해당 벡터를 역순으로 정렬한다.
그럼 앞에서부터 귤의 개수를 카운트하면 된다.
코드
#include <algorithm>
#include <vector>
using namespace std;
int solution(int k, vector<int> tangerine) {
sort(tangerine.begin(), tangerine.end());
vector<int> tangerineSize;
// 크기별로 개수 세기
int idx = 0;
while (true) {
if (idx >= tangerine.size())
break;
auto k = upper_bound(tangerine.begin(), tangerine.end(), tangerine[idx]);
int num = k - lower_bound(tangerine.begin(), tangerine.end(), tangerine[idx]);
tangerineSize.push_back(num);
idx = k - tangerine.begin();
}
sort(tangerineSize.begin(), tangerineSize.end(), greater<>());
// 개수가 많은 것 부터 선택
int cnt = 0;
while (k > 0) {
k -= tangerineSize[cnt];
cnt++;
}
return cnt;
}
반응형
'알고리즘 > 코테 문제' 카테고리의 다른 글
[BOJ/백준 1759][C++] 암호 만들기 (0) | 2023.08.09 |
---|---|
[BOJ/백준 21608][C++] 상어 초등학교 (0) | 2023.08.08 |
[Programmers/프로그래머스 lv2][C++] 멀리 뛰기 (0) | 2023.08.07 |
[Programmers/프로그래머스 lv2][C++] N개의 최소공배수 (0) | 2023.08.06 |
[Programmers/프로그래머스 lv2][C++] 점프와 순간 이동 (0) | 2023.08.05 |
Comments