개발/알고리즘(코딩테스트)

프로그래머스, 자바스크립트) 예산

빔네모 2025. 5. 22. 23:22

예산

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

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

풀이

메모리: 33.7 MB, 시간: 6.48 ms

 

d는 부서별로 신청한 금액이 들어있는 배열, budget은 예산이다. 최종적으로 구해야하는 건 지원할 수 있는 물품의 수.

 

예산이 적은 팀부터 처리하기 위해 금액을 오름차순으로 정렬한다.
각 팀의 요청 금액이 남은 예산을 초과하면 반복을 중단하고 초과하지 않으면 금액을 예산에서 차감하고 결과 값을 증가시킨다.

function solution(d, budget) {
  let result = 0;
  let leftBudget = budget;

  // 비용이 적은 순으로 정렬
  const costSort = [...d].sort((a, b) => a - b);

  for (const cost of costSort) {
    if (leftBudget < cost) break; // 조기 리턴
    leftBudget -= cost;
    result++;
    // console.log(leftBudget, result); 
  }

  return result;
}

 

다른 풀이

메모리: 33.6 MB, 시간: 0.22 ms

 

오름차순 정렬까진 동일하나, 반복문에서 인덱스를 활용한다.

합계가 예산을 넘어가기 전까지의 인덱스가 지원할 수 있는 물품 수가 된다. 

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; // 모두 처리 가능한 경우
}

코드 스타일을 다르게 바꿔보려면 reduce를 사용할 수 있다. (조기 종료는 안됨)

function solution(d, budget) {
  d.sort((a, b) => a - b);
  let sum = 0;
  return d.reduce((count, cost) => {
    sum += cost;
    return sum <= budget ? count + 1 : count;
  }, 0);
}