function solution(k, tangerine) {
var answer = 0;
//오름차순 정렬해서 많은거 순서대로 넣기 -> 최소가 될 확률이 높다.
// number 별 갯수
//갯수대로 오름차순
// 앞에서 끊어 k개 그리고 k개에 들어온 number의 종류 수는 최소이다.
const test = tangerine.sort((a,b) => a - b)
let countPerNumberArray = [];
//넘버별 갯수 배열
// console.log('testArray:', test)
let count = 0;
for (let i = 0; i < test.length; i++) {
//
// console.log(i,'번째','count:', count)
if(countPerNumberArray.length == 0){
count++;
countPerNumberArray.push({
number: test[i],
count: count,
})
}
// 숫자가 같을때
if(i>0) {
if(countPerNumberArray[countPerNumberArray.length-1] && countPerNumberArray[countPerNumberArray.length-1].number == test[i]) {
// console.log('숫자가 같을때', test[i])
count++;
countPerNumberArray[countPerNumberArray.length-1].count = count;
// console.log(countPerNumberArray)
}
}
if(i>0) {
if(countPerNumberArray[countPerNumberArray.length-1] && countPerNumberArray[countPerNumberArray.length-1].number !== test[i]){
// console.log('숫자가 다를때', test[i])
count = 1;
// console.log(countPerNumberArray[countPerNumberArray.length-1]?.number, '!==' ,test[i])
countPerNumberArray.push({
number: test[i],
count: 1,
})
// console.log(countPerNumberArray)
}
}
// console.log('i:', i)
}
// console.log("countPerNumberArray:", countPerNumberArray)
const test1 = countPerNumberArray.sort((a,b) => b.count - a.count)
let accNum = 0;
const a = test1.reduce(function(acc,curr,currIndex,array){
//k값보다 커지면 안됨, 커지는 순간의 종류갯수?
if(acc == k || acc > k) {
// console.log('currIndex:', currIndex)
answer = currIndex;
return;
}
return acc + curr.count;
}, 0);
// console.log('a:', a)
return answer;
}
이렇게 짜서 정확도 79.4점을 받았다.
근데 가독성이 너무 떨어진다. 이유가 뭘까
아무도 내가 원하는 자료구조를 만들때 (귤을 크기로 분류해서 갯수를 가지고있는 배열) 나처럼 if문 써서 안만든다... -> forEach, Set 같은 자료구조에는 자료구조로.
배울게 하나 있었는데
let test = {};
test[item] = 0
test = {
item = 0;
}
사실 이걸 알고있었는데도 왜이렇게 익숙치 않는지
유사배열객체 아마 계속 배열을 만들어야한다 라는 생각에 객체생성할 생각을 못하는듯.
자료구조를 만든 후 for 문에서 계속 막혔다. 정확도 79.4 에서 케이스 12~15 그리고 22~25 였나 잘 기억이 안나지만 계속해서 통과를 못했다.
for(let i = 0; i < fruits.length; i++) {
if(sum < k) {
sum += fruits[i]
} else {
console.log('i:', i)
answer = i;
return answer;
}
}
생각못한 edge 케이스는 i 가 마지막에 닿았을 때이다.
마지막에서야 sum 이 k와 같아진다면 거기에 대한 분기처리가 안되어있다.
for(let i = 0; i < fruits.length; i++) {
if(sum < k) {
sum += fruits[i]
if(sum >= k) {
answer = i+1;
return answer;
}
}
}
그래서 if 안에 if를 넣어서 해결했다.
근데 뭔가 좀 별로인 생각도 들어서 다른 답들도 보니 이게 가장 보기 좋았다.
let count = 0;
for(let fruit of fruits) {
sum += fruit;
count++;
if(sum>=k) return count;
}
for...of 문에서는 i가 없으니 count로 대체. 되게 좋아보였고 while문도 많았다.
while(k>0) {
k = k-(test[idx])
idx = idx + 1;
}
낙방여우님의 도움을 받아 해결한 부분이 for 부분이었다.