제출 후 오류가 난 이유를 알아보자.
해시맵 + 그리디? 를 이용하는 방법으로 접근해서 구현하였다. 여기서 그리디는 개수가 많은 것부터 정렬을 통해서 가짓수를 최소화하는 방법을 생각한 것이다.
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;
}
로직에 대한 가독성이 좋아졌다! 👍🏻