나의 풀이
function solution(k, tangerine) {
const countEachSize = tangerine.reduce((acc,cur) => {
acc[cur] = (acc[cur] || 0) + 1
return acc
},{})
const numberOfEachSize = Object.values(countEachSize).sort((a,b) => b - a)
let NumberToPack = k
while(NumberToPack) {
if(numberOfEachSize[0]) numberOfEachSize[0] -= 1
else {
numberOfEachSize.shift()
continue
}
NumberToPack -= 1
if(!NumberToPack && !countEachSize[0]) numberOfEachSize.shift()
}
const result = Object.keys(countEachSize).length - numberOfEachSize.length
return result ? result : 1
}
countEachSize 각각 귤의 사이즈 별로 개수를 체크한 뒤
numberOfEachSize로 귤의 사이즈 개수만 가져온뒤 내림차순으로 정렬을 해주었다
왜냐하면 귤 사이즈가 몇인지는 불필요한 정보기에 개수만 가져온것이고 내림차순은 중복의 개수가 많은 것부터 상자에 담기 위해서다
쉽게 말해 중복의 개수가 많은 것부터 while을 사용해서 상자에 담는다. 해당 사이즈의 귤을 다 담으면 0으로 개수가 표기되고 shift를 통해 아예 빼버린다. ( 이 부분 때문에 시간이 더 걸림)
이러한 과정을 거쳐 한 상자에 담으려는 귤의 개수 k가 0이 될 때 상자에 담지 못한 귤들만 남아있어서
귤의 사이즈 종류 개수 - 담지 못한 귤의 종류 개수를 해주면 답이나온다. (종류 개수가 같다면 서로 다른 종류의 수의 최소값은 1이다.)
하지만 이렇게 풀었더니 통과는 했지만 tangerine의 data가 커질 수록 시간이 엄청 오래걸려서 수정이 필요했다.
그래서 아래와 같이 수정하였다.
function solution(k, tangerine) {
const countEachSize = tangerine.reduce((acc,cur) => {
acc[cur] = (acc[cur] || 0) + 1
return acc
},{})
const numberOfEachSize = Object.values(countEachSize).sort((a,b) => b - a)
let sum = 0
let count = 0
const NumberToPack = k
while(sum < NumberToPack) {
sum += numberOfEachSize[count++]
}
return count
}
일단 shfit를 아예 쓰지 않으려고 했다. 대신 그로 인하여 변수가 늘었다.
시간은 이전보다 훨씬 단축되었다.
바뀐점은 귤을 index 0 부터 가져오면서 계속 더하는 것이다.
index가 1 늘어날 때마다 사이즈 종류가 한 개씩 추가되는 것이니 index로도 사용가능하고 count로도 사용이 가능했다.
그리하여 sum이 한 상자에 담으려는 귤의 개수보다 많아지면 while문이 중단되고 count가 return되는 것이다.
다른 사람 풀이
function solution(k, tangerine) {
let answer = 0;
const tDict = {};
tangerine.forEach((t) => tDict[t] = (tDict[t] || 0) + 1);
const tArr = Object.values(tDict).sort((a, b) => b - a);
for (const t of tArr) {
answer++;
if (k > t) k -= t;
else break;
}
return answer;
}
이 풀이 좋다
for문을 통해서 해당 사이즈 귤의 개수가 한 상자에 담으려는 귤의 개수보다 작으면 k -= t를 해주게끔 반복문이 작성되었다.
나보다 변수 개수도 적고 가독성이 더 좋다
'알고리즘 > 프로그래머스 - JS' 카테고리의 다른 글
[프로그래머스 - JS] level.1 과일 장수 (0) | 2023.01.15 |
---|---|
[프로그래머스 - JS] level.2 주차 요금 계산 (0) | 2023.01.02 |
[프로그래머스] level.2 압축 (0) | 2022.12.27 |
[프로그래머스 - JS] level.2 k진수에서 소수 개수 구하기 (0) | 2022.12.26 |
[프로그래머스 - JS] level.2 프린터 (0) | 2022.12.23 |