[프로그래머스] 귤 고르기 - JavaScript

문제 출처

Lv.2 귤 고르기 - 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

피드백은 언제나 환영입니다. 😊