[프로그래머스] 귤 고르기 - JavaScript
문제 출처
문제 설명
경화는 과수원에서 귤을 수확했습니다. 경화는 수확한 귤 중 ‘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
예시
입출력 예
k | tangerine | return |
---|---|---|
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 |
풀이
function solution(k, tangerine) {
const obj = {};
// 같은 종이 몇개가 있는지 확인한다.
tangerine.forEach((n) => {
// obj[n] 값이 있으면 1을 더한 값을
// obj[n] 값이 없으면 1을 넣어준다.
obj[n] = ++obj[n] || 1;
});
// 결과 ex) { '1': 1, '2': 2, '3': 2, '4': 1, '5': 2}
// 서로 다른 종류의 수의 최솟값을 구하기 위해서는 종류는 상관 없고 값만 필요합니다.
// Objext.values() 메서드를 통해 값만 추출 한 후
// sort() 메서드를 이용해 내림차순으로 정렬해줍니다.
const kind = Object.values(obj).sort((a, b) => b - a);
// kind = [2, 2, 2, 1, 1]
let sum = 0;
let answer = 0;
// kind를 하나 씩 체크합니다. 정렬했기에 가장 큰 수부터 체크가 됩니다.
for (let num of kind) {
// 한번 for문이 돌 때 마다 answer값에 1을 증가시키고.
// sum 값에 들어온 값들을 더해줍니다.
answer++;
sum += num;
// sum의 값이 k보다 크거나 같으면 최솟값을 충죽했으므로 for문을 중지시킵니다.
if (sum >= k) break;
}
return answer;
}
console.log(solution(6, [1, 3, 2, 5, 4, 5, 2, 3])); // 3
console.log(solution(4, [1, 3, 2, 5, 4, 5, 2, 3])); // 2
console.log(solution(2, [1, 1, 1, 1, 2, 2, 2, 3])); // 1
정리
레벨 2의 문제이지만 비교적 정답률도 높고 풀이도 간단한 문제였습니다!
사용된 메서드와 문법에 대해 더 공부하고 싶으신 분은 링크를 클릭해주세요!
forEach() 메서드 - MDN
Object.values() 메서드 - MDN
sort() 메서드 - MDN
피드백은 언제나 환영입니다. 😊