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 함수를 작성해주세요.
풀이
귤의 크기의 종류가 최소가 되도록 k개의 귤을 고를 때, 크기의 종류의 수를 return하는 문제이다.
처음에는 HashMap을 사용해야 하나 싶었는데, 생각해보니 크기가 중요한 것이 아니라 크기의 종류를 세는 것이 중요하기 때문에 그냥 배열만 사용해도 될 것 같아 일차원 배열로 구현해보았다.
과정을 크게 두 단계로 나누면 아래와 같다.
귤의 크기 범위(1 ~ 10,000,000)만큼의 크기를 가진 배열을 만들고, 수확한 귤을 크기에 맞게 배열에 넣었다.
이후, 오름차순 정렬을 하였고 뒤에서부터 k개를 선택하였다.
코드
import java.util.*;
class Solution {
public int solution(int k, int[] tangerine) {
int answer = 0;
int countLen = 10000001;
int[] count = new int[countLen];
int index = 0;
for(int i = 0; i < tangerine.length; i++) {
if(count[tangerine[i]] == 0) index++;
count[tangerine[i]]++;
}
Arrays.sort(count);
for(int i = countLen - 1; i >= countLen - index; i--) {
if(k <= 0) break;
k -= count[i];
answer++;
}
return answer;
}
}
틀린 부분이 있다면 정정해 주시면 감사하겠습니다.
궁금한 부분이 있거나, 다른 아이디어가 있으시면 자유롭게 댓글 남겨주세요!
'[JAVA]프로그래머스 > Lv.2' 카테고리의 다른 글
[JAVA]프로그래머스 - 멀리 뛰기 (0) | 2024.04.08 |
---|---|
[JAVA]프로그래머스 - 최댓값과 최솟값 (0) | 2024.04.06 |