[코테] 예산내에서 최대한 많은 부서 지원해주기

JulyK9·2023년 5월 9일
0

문제

S사에서는 각 부서에 필요한 물품을 지원해 주기 위해 부서별로 물품을 구매하는데 필요한 금액을 조사.
전체 예산이 정해져 있기 때문에 모든 부서의 물품을 구매해 줄 수는 없으나 최대한 많은 부서의 물품을 구매해 줄 수 있도록 하려고 함.

물품을 구매해 줄 때는 각 부서가 신청한 금액만큼을 모두 지원해 줘야 함. 예를 들어 1,000원을 신청한 부서에는 정확히 1,000원을 지원해야 하며, 1,000원보다 적은 금액을 지원해 줄 수는 없음.

부서별로 신청한 금액이 들어있는 배열 d와 예산 budget이 매개변수로 주어질 때, 최대 몇 개의 부서에 물품을 지원할 수 있는지 return 하도록 solution 함수를 완성

제출코드

function solution(d, budget) {
  // arr.sort() 는 원본배열을 변경
  d.sort((a,b) => a-b);

  // 부서별 신청금액을 합산해나갈 변수
  let sum = 0;
  
  for(let i = 0; sum <= budget; i++) {
    // 현재 합산금액에 해당부서 신청 금액을 더한 결과가 예산을 넘지 않으면
    if(sum + d[i] <= budget) {
      // 그 신청 예산을 합산금액에 더해주고
      sum += d[i]
      // 다음 루프를 진행
      continue
    }
    
    // 현재 합산 금액이 예산을 넘지는 않았는데(그래서 루프안에 들어옴)
    // 다음 신청 금액을 더하면 예산을 넘게 된다면
    // 그때 i(지원하는 부서의 개수)
    return i;
  }
}

접근방법

  • 최대한 딱 맞춰서 준다고 할 때, 한도(예산)안에서 작은 것부터(부서별 신청금액) 더해나가며 맞춰지는 순간을 찾는 기본 로직을 이해해야 함
  • 작은 것부터 더해줘야하므로 정렬을 시키고 작업을 수행
  • 예산을 넘지 않으면 되니까 예산과 같은 경우까지 반영해줘야 함
  • 다음 신청 금액 합산시 배열의 마지막 요소 다음은 없으므로 undefined를 출력하게 되고 number + undefined는 NaN이 됨
  • NaN을 부등호로 비교하게 되는 반환값은 false로 결과적으로 더이상 루프를 진행하지 않고 리턴하게 되며 이때 i의 값이 지원해줄 수 있는 총 부서의 수가 됨

회고

  • sort() 메서드는 원본배열을 변경하기 때문에 변수에 재할당해줄 필요가 없음
  • undefined와 NaN 같은 경우의 수를 이용하지 않는 로직으로 다시 해볼 필요가 있다.
  • 배열의 길이까지 반복작업을 해주면서 예산과 비교해보는 방법도 생각해보자.

참고자료

profile
느리지만 꾸준하게. 부족하거나 잘못된 부분은 알려주시면 감사하겠습니다.

0개의 댓글