처음부터 차근차근

[프로그래머스] Lv1 예산 본문

코딩테스트/Javascript

[프로그래머스] Lv1 예산

HangJu_95 2023. 10. 31. 23:04
728x90

문제 링크

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

문제 설명

내 풀이

function solution(d, budget) {
    // 1. sort로 예산을 작은 수로 정렬한다.
    d.sort((a,b) => a-b)
    // 2. total 예산을 선언
    let total = 0;
    // 3. 반복문을 진행하면서 total 예산을 더해준다
    for (let i = 0; i <d.length; i++) {
        total += d[i]
        // console.log(total)
        // 3-1. 예산이 딱 맞는 경우
        if (total == budget) {
            return i + 1
        }
        // 3-1 total 값이 예산보다 큰 경우
        if (total > budget) {
            return i
        }
    }
    // 4. 반복문을 다 하고도 예산이 남은 경우
    return d.length
}

1. 예산을 작은 것부터 정렬한다.

작은 예산부터 넣어야 최대한 많은 부서를 넣을 수 있기 때문이다.

2. 반복문을 진행하면서 예산을 추가한다.

예산이 딱 맞는 경우에는 인덱스 i + 1을 하였고,

더했을 때 total 금액이 예산보다 큰 경우에는, 최종적으로 예산을 추가했던 부서를 빼야하기 때문에

i를 하였다.

예산이 남는 경우도 있으니 이러한 경우는 부서의 개수를 return하였다.

다른 사람의 풀이

function solution(d, budget) {
    return d.sort((a, b) => a - b).reduce((count, price) => {
        return count + ((budget -= price) >= 0);
    }, 0);
}

reduce 메서드를 활용한 풀이법

((budget -= price) >= 0)

이 부분이 가장 간결해 보였으며 "+ ((budget -= price) >= 0)" 이 부분이 boolean 계산의 값에 따라 0 또는 1이 된다고 한다.

(true = 1, false = 0인 암묵적 변환을 이용)

이렇게 하여 부서 추가가 가능하면 1, 안된다면 0을 하여 얼만큼 카운트 되었는지 알 수 있다.

단지, 예산 한도보다 추가되었을 경우에도 계속 계산한다는 단점이 존재.

오늘 배운 점

  • 암시적 형변환을 이용하는 방법