본문 바로가기
코테연습

59. 예산 Javascript

by hxunz 2022. 6. 8.

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

 

코딩테스트 연습 - 예산

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

programmers.co.kr

 

1. 문제에 대한 이해

  • 우리가 풀어야 할 문제는 무엇인가?
     - 최대 몇 개의 부서에 물품을 지원할 수 있는가?
  • 주어진 자료는 무엇인가?
     - d : 부서별로 신청한 금액
     - budget : 예산
  • 조건은 무엇인가?
     - 물품을 구매해 줄 때는 각 부서가 신청한 금액만큼을 모두 지원해줘야한다.

 

2. 계획

  1. 이 문제를 푸는데 있어서 유용하게 쓸 수 있는 지식은 무엇인가?
     - map / forEach
 
첫번째 풀이
  1.  d를 올림차순으로 정리한다.
  2. 변수 money에 0을 선언 (물품 살 수 있는 최대 예산 담을 곳)
  3. 변수 count에 0을 선언 (몇개의 부서에게 물품을 줄 수 있는지 담을 곳)
  4. d를 올림차순 한 배열을 순회하면서 이 배열의 요소들을 money에 더할 것
  5. money가 budget 이하인 경우에는 count에 +1을 해주고
  6. count 값을 리턴한다.
 
두번째 풀이
  1. d를 올림차순으로 정리한다.
  2. 변수 count에 0을 선언 (몇개의 부서에게 물품을 줄 수 있는지 담을 곳)
  3. d를 올림차순 한 배열(departement)을 순회하면서 이 배열의 요소들을 budget에서 뺄 것
  4. 그리고 count에는 +1을 해줄 것
  5. budget이 departement의 요소보다 작을 경우 빼지 않는다
  6. count 값 리턴
 

3. 실

 

첫번째 풀이 실행
const solution = (d, budget) => {
  let money = 0;
  let count = 0;
  const departement = d.sort((a, b) => a-b);

  departement.forEach(it => {
    money += it;
    if (money <= budget) {
      count++;
    }
  });

  return count;
};

 

두번재 풀이 실행
const solution = (d, budget) => {
  const departement = d.sort((a, b) => a - b);

  return departement.map(it => budget -= it).filter(it => it >= 0).length;
};

test('예산', () => {
  expect(solution([1, 3, 2, 5, 4], 9)).toEqual(3);
  expect(solution([2,2,3,3], 10)).toEqual(4);
});

 

 

 

 

첫번째 풀이를 할때에는 money라는 변수에다가 사용한 값들을 따로 저장해야겠다고 생각을 했었는데 
문제를 풀다보니까 그냥 처음 주어진 예산에서 사용한 값을 빼면 되는거 아닌가..? 하는 생각이 들었다.
그래서 두번째 풀이 계획을 세우고 실행을 했는데 훨씬 코드가 간단해졌다! 
문제가 비교적 쉬웠어서 그런가 문제를 풀다가 다른 방법이 생각났다는게 신기했다. 

'코테연습' 카테고리의 다른 글

61. 최소직사각형 Javascript  (3) 2022.06.14
60.약수의 개수와 덧셈 Javascript  (0) 2022.06.11
58. 실패율 Javascript  (0) 2022.06.08
57. 부족한 금액 계산하기 Javascript  (0) 2022.06.08
56. 폰켓몬 Javascript  (0) 2022.05.31

댓글