728x90
문제 설명
회사에서 여러 부서가 지원을 요청하며, 총 예산을 초과하지 않는 범위에서 최대한 많은 부서의 요청을 승인하려고 합니다.
각 부서의 지원 요청 금액이 담긴 배열 d와 총 예산 budget이 주어질 때, 예산 내에서 지원할 수 있는 최대 부서의 수를 구하는 문제입니다.
제한 조건
- d의 길이: 1 이상 100 이하
- 각 부서의 지원 요청 금액: 1 이상 100,000 이하
- 총 예산 budget: 1 이상 10,000,000 이하
해결 방법
알고리즘: 그리디 (Greedy)
- 문제의 핵심
- 예산을 최대한 많은 부서에 나누어주려면, 작은 금액부터 순차적으로 처리해야 합니다.
- 이를 위해, 부서 요청 금액을 오름차순 정렬합니다.
- 구현 방식
- 배열 d를 오름차순으로 정렬합니다.
- 요청 금액을 하나씩 누적하여 합산합니다.
- 합이 총 예산 budget을 초과하면, 그 시점까지 승인된 부서의 개수를 반환합니다.
- 예산 초과 시 처리
- 요청 금액을 합산하는 과정에서 예산을 초과하면, 더 이상 부서를 승인할 수 없으므로 즉시 종료합니다.
- 모든 요청이 예산 내에 포함되는 경우
- 반복문이 끝날 때까지 예산을 초과하지 않으면, 모든 부서가 승인됩니다.
시간 복잡도
- 정렬 연산
- d를 정렬하는 데 O(n log n).
- 합산 연산
- 최대 n번 순회하므로 O(n).
- 총 시간 복잡도
- O(n log n).
구현 코드
function solution(d, budget) {
d.sort((a, b) => a - b);
let sum = 0;
for (let i = 0; i < d.length; ++i) {
sum += d[i];
if (sum > budget) {
return i;
}
}
return d.length;
}
'알고리즘' 카테고리의 다른 글
[Javascript] 백준 25957번 단어 우월 효과 (0) | 2025.01.06 |
---|---|
[Typescript] 백준 27535번 제주 초콜릿 지키기 (0) | 2025.01.05 |
[Javascript] 프로그래머스 - 영어 끝말잇기 (0) | 2025.01.04 |
[Javascript] 프로그래머스 - 점프와 순간 이동 (0) | 2025.01.04 |
[Javascript] 프로그래머스 - 피보나치 수 (0) | 2025.01.04 |