본문 바로가기
코테연습

171.귤 고르기 Javascript

by hxunz 2023. 1. 4.

https://school.programmers.co.kr/learn/courses/30/lessons/138476

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

1. 문제에 대한 이해

  • 우리가 풀어야 할 문제는 무엇인가?
    경화가 귤 k개를 고를 때 크기가 서로 다른 종류의 수의 최솟값을 return 
  • 주어진 자료는 무엇인가?
    k: 경화가 한 상자에 담으려는 귤의 개수
    tangerine: 귤의 크기를 담은 배열
  • 조건은 무엇인가?
     귤을 크기별로 분류했을 때 서로 다른 종류의 수를 최소화하라

2. 계획

  • 귤의 종류에 따른 개수를 구한다.
  • 개수가 많은 순으로 내림차순 정렬한다.
  • 정렬한 배열을 순회하면서 귤을 담을 배열에 차례대로 넣어준다.
  • 이때, 귤 종류를 센다.
  • 귤의 종류가 k개를 넘어선다면 순회를 멈춘다.
  • 귤을 담은 배열의 길이를 리턴한다. 

3. 실행

  • 풀이 계획을 실행하고, 각 단계가 올바른지 점검하라.
const solution = (k, tangerine) => {
  const tangerineKind = tangerine.reduce((acc, cur) => {
    acc[cur] = (acc[cur] || 0) + 1;
    return acc
  }, {});

  const tangerineSort = Object.values(tangerineKind).sort((a, b) => b - a);

  let minTangerines = [];
  let sum = 0;

  for (let i = 0; i < tangerineSort.length; i++) {
    sum += tangerineSort[i]
    minTangerines.push(tangerineSort[i])

    if (sum >= k) break;
   }

  return minTangerines.length;
};

test('choose tangerine', () => {
  expect(solution(6, [1, 3, 2, 5, 4, 5, 2, 3])).toEqual(3);
  expect(solution(4, [1, 3, 2, 5, 4, 5, 2, 3])).toEqual(2);
  expect(solution(2, [1, 1, 1, 1, 2, 2, 2, 3])).toEqual(1);
});

4. 반성

  • 조금 더 코드를 다듬어 보았다.
const solution = (k, tangerine) => {
  const tangerineKind = tangerine.reduce((acc, cur) => {
    acc[cur] = (acc[cur] || 0) + 1;
    return acc
  }, {});

  const tangerineSort = Object.values(tangerineKind).sort((a, b) => b - a);

  let sum = 0;
  for (const it of tangerineSort) {
    sum++;
    if (k > it) k -= it;
    else break;
  }

  return sum;
};

 

댓글