Skip to content

Latest commit

 

History

History
95 lines (75 loc) · 3.2 KB

26.md

File metadata and controls

95 lines (75 loc) · 3.2 KB

귤 고르기

제출 후 오류가 난 이유를 알아보자.

해시맵 + 그리디? 를 이용하는 방법으로 접근해서 구현하였다. 여기서 그리디는 개수가 많은 것부터 정렬을 통해서 가짓수를 최소화하는 방법을 생각한 것이다.

function solution(k, tangerine) {
  const hash = {};
  for (let i = 0; i < tangerine.length; i++) {
    if (hash[tangerine[i]]) hash[tangerine[i]]++;
    else hash[tangerine[i]] = 1;
  }

  const arr = Object.entries(hash).sort((a, b) => b[1] - a[1]);

  let total = 0,
    result = 0;
  for (const [size, number] of arr) {
    const tmp = total + number;
    if (tmp === k) {
      return ++result;
    } else if (tmp < k) {
      total = tmp;
      result++;
    }
  }

  return result;
}

문제 자체를 접근할 때 어렵지는 않았고 실제로 제출까지 오래 걸리지 않았다. 그런데 제출 후 테스트 케이스가 70점을 달성하였다. 이유에 대해서 여러가지 방면에서 생각해보았는데, 나는 그 이유를 찾지 못했다. 사실 이유를 찾았을 때도 이렇게 생각할 근거가 도대체 어디에 있지 라는 생각을 하게 만들었다.

위 코드는 주어진 테스트 케이스에서는 한 상자에 담으려는 귤의 개수 k를 만들수 있는 경우의 수가 무조건 한 개는 존재한다는 가정으로 구현되어있다. 하지만 실제로는 어떠한 경우의 수로 더해도 k개가 될 수 없는 테스트 케이스도 존재했던 것이다. 그렇다면 문제에서 이런 경우는 어떤 값을 반환하라고 알려줘야하지 않을까? 마치 경우의 수가 없는 경우 -1을 반환하시오 처럼 말이다. 내가 한국말이 서툴러서(?) 문제를 정확히 이해하지 못하는 것일 수도 있지만, 개인적으로 좀 아쉬운 문제이다. 이러한 이유로 인해서 tmp > k가 커지는 순간까지 더하고 그 값을 반환해야하는 로직을 추가해야했다.

function solution(k, tangerine) {
  const hash = {};
  for (let i = 0; i < tangerine.length; i++) {
    if (hash[tangerine[i]]) hash[tangerine[i]]++;
    else hash[tangerine[i]] = 1;
  }

  const arr = Object.entries(hash).sort((a, b) => b[1] - a[1]);

  let total = 0,
    result = 0;
  for (const [size, number] of arr) {
    const tmp = total + number;
    if (tmp === k) {
      result++;
      break;
    } else if (tmp < k) {
      total = tmp;
      result++;
    } else {
      // ✅
      result++;
      break;
    }
  }

  return result;
}

체크박스 부분이 새롭게 추가된 로직

위 코드의 for문을 리팩토링 해보았다. 생각해보면 굳이 저렇게 조건을 나열할 필요가 없어보였다. tmp >= k 경우에 for문을 멈추면 되는 것!

function solution(k, tangerine) {
  const hash = {};
  for (let i = 0; i < tangerine.length; i++) {
    if (hash[tangerine[i]]) hash[tangerine[i]]++;
    else hash[tangerine[i]] = 1;
  }

  const arr = Object.entries(hash).sort((a, b) => b[1] - a[1]);

  let total = 0,
    result = 0;
  for (const [size, number] of arr) {
    result++;
    total += number;

    if (total >= k) break;
  }

  return result;
}

로직에 대한 가독성이 좋아졌다! 👍🏻