한 걸음씩

[프로그래머스][JS] 귤 고르기 본문

Programmers

[프로그래머스][JS] 귤 고르기

winter17 2023. 8. 14. 21:44

https://school.programmers.co.kr/learn/courses/30/lessons/138476

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이 과정

function solution(k, tangerine) {
    let obj = {}
    for (let i = 0; i < tangerine.length; i++){
        if (obj[tangerine[i]]){
            obj[tangerine[i]]++
        }else{
            obj[tangerine[i]] = 1
        }
    }
    // 크기가 서로 다른 종류의 수(obj)인 귤을 최소화하려면 내림차순으로 정렬(values)하여 
    // 배열(values)에서 하나씩 꺼내어 더한 값(sum)이 k보다 크면 누적 더하기를 종료
    // 배열(values)에서 하나씩 꺼내어 더할때마다 카운트 횟수(cnt)를 체크하여 반환
    
    // value값만 배열로 만들어서 내림차순으로 정렬
    const values = Object.values(obj).sort((a, b) => b - a)
    
    let sum = 0
    let cnt = 0
    while(true){
        if (k <= sum){
            break
        }else{
            sum += values[cnt]
            cnt++
        }
    }
    return cnt;
}

리뷰

주어진 tangerine 배열을 객체로 만드는 것까지는 생각했는데

서로 다른 종류의 수를 어떻게 최소화할지에 대해서는 힌트가 필요했다.

객체의 value값을 내림차순으로 정렬하여 하나씩 누적 합을 하면 서로 다른 종류의 수를 최소화할 수 있다.

그리고 위의 과정을 수행할 때 누적 합을 할 때 k를 초과하지 않으면 된다.

배열에서 수를 하나씩 꺼내어 더할 때마다 횟수를 기록했다가 그 횟수를 리턴하면 된다.