귤 고르기

정태수·2025년 3월 11일
post-thumbnail
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;
        }
    }

for문 문제

생각못한 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 부분이었다.

교훈

  1. edge케이스 시작 / 중간 / 끝을 항상 생각하자
  2. 자료구조는 자료구조로 부셔보자
profile
프론트엔드 개발자

0개의 댓글