본문 바로가기
문제풀이/프로그래머스

[Javascript] 예산

by dev_kong 2022. 1. 4.
728x90
728x90

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

 

코딩테스트 연습 - 예산

S사에서는 각 부서에 필요한 물품을 지원해 주기 위해 부서별로 물품을 구매하는데 필요한 금액을 조사했습니다. 그러나, 전체 예산이 정해져 있기 때문에 모든 부서의 물품을 구매해 줄 수는

programmers.co.kr

문제설명

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

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

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

제한사항

  • d는 부서별로 신청한 금액이 들어있는 배열이며, 길이(전체 부서의 개수)는 1 이상 100 이하입니다.
  • d의 각 원소는 부서별로 신청한 금액을 나타내며, 부서별 신청 금액은 1 이상 100,000 이하의 자연수입니다.
  • budget은 예산을 나타내며, 1 이상 10,000,000 이하의 자연수입니다.

입출력 예

dbudgetresult

[1,3,2,5,4] 9 3
[2,2,3,3] 10 4

입출력 예 설명

입출력 예 #1
각 부서에서 [1원, 3원, 2원, 5원, 4원]만큼의 금액을 신청했습니다. 만약에, 1원, 2원, 4원을 신청한 부서의 물품을 구매해주면 예산 9원에서 7원이 소비되어 2원이 남습니다. 항상 정확히 신청한 금액만큼 지원해 줘야 하므로 남은 2원으로 나머지 부서를 지원해 주지 않습니다. 위 방법 외에 3개 부서를 지원해 줄 방법들은 다음과 같습니다.

  • 1원, 2원, 3원을 신청한 부서의 물품을 구매해주려면 6원이 필요합니다.
  • 1원, 2원, 5원을 신청한 부서의 물품을 구매해주려면 8원이 필요합니다.
  • 1원, 3원, 4원을 신청한 부서의 물품을 구매해주려면 8원이 필요합니다.
  • 1원, 3원, 5원을 신청한 부서의 물품을 구매해주려면 9원이 필요합니다.

3개 부서보다 더 많은 부서의 물품을 구매해 줄 수는 없으므로 최대 3개 부서의 물품을 구매해 줄 수 있습니다.

입출력 예 #2
모든 부서의 물품을 구매해주면 10원이 됩니다. 따라서 최대 4개 부서의 물품을 구매해 줄 수 있습니다.

 

접근방법

인프런 강의에서 비슷한 유형의 문제를 푼적있어서 쉽게 풀었다.

인프런 문제가 훨씬훨씬훨씬훨씬훨씬 어려웠다...

 

https://kong-dev.tistory.com/82?category=986795 

 

4-4 졸업선물

문제설명 학생들에게 졸업선물을 해주기 위해 갖고 학생들에게 직접 갖고 싶은물건의 가격과 배송비를 알아오라고 했다. 선생님에겐 한정된 예산과, 물건값의 50%를 할인해주는 쿠폰이 있다. 단

kong-dev.tistory.com

 

오름차순으로 정렬하고,

 

for문 안에서

budget 에서 d[i] 빼준뒤에

budget 이 0보다 크거나 같으면, answer에 1을 더해주고,

budget 이 0보다 작으면 answer를 return한다.

for 문 밖에서 answer를 return 한다.

 

function solution(d, budget) {
  let answer = 0;
  d.sort((a, b) => a - b);
  for (let i = 0; i < d.length; i++) {
    budget -= d[i];

    if (budget >= 0) answer += 1;

    if (budget < 0) return answer;
  }
  return answer;
}

const budget = 9;
const d = [1, 2, 3, 4, 5];
console.log(solution(d, budget)); // 3

 

쉬워서 딱히 설명할 것도 없다.

 

이슈

function solution(d, budget) {
  let answer = 0;
  d.sort((a, b) => a - b);
  for (let i = 0; i < d.length; i++) {
    budget -= d[i];

    if (budget >= 0) answer += 1;

    if (budget < 0) return answer;
  }
  //for밖에서 리턴 안해줌;ㅎ
}

const budget = 9;
const d = [1,2,3];
console.log(solution(d, budget)); // undefined

당연히 부서에서 필요로 하는예산의 합이 budget 보다 클거라고 생각하고,

for문 밖에서 리턴을 안해줬었다..ㅎ

생각해보니 예산이 남는 경우(위 예시코드)는 리턴을 안해주더라,

for문 밖에서 return answer 해주니까 정상적으로 잘 작동함.

 

다른사람의 풀이

function solution(d, budget) {
    d.sort((a, b) => a - b);

    while (d.reduce((a, b) => (a + b), 0) > budget) d.pop();

    return d.length;
}

크.. 아름다운 코드다.

reduce만 이해한다면 가독성도 상당히 좋다.

오름차순으로 정렬해주고,

reduce로 전체 희망예산의 합을 구하고,

그 합이 budget보다 크면

pop으로 d의 마지막 value를 반복 하는작업을

while문으로 반복한다.

 

전체 희망예산의 합이 budget보다 작아지면 반복문을 탈출하고

d의 length를 리턴한다.

 

아름답다. 

728x90
728x90

'문제풀이 > 프로그래머스' 카테고리의 다른 글

[프로그래머스] 최소직사각형  (0) 2022.02.14
[Javascript] 3진법 뒤집기  (0) 2022.01.04
[Javascript]크레인 인형뽑기 게임  (0) 2022.01.04
[Javascript] 폰켓몬  (0) 2022.01.04
모의고사  (0) 2021.12.28

댓글