알고리즘🅰/프로그래머스

[프로그래머스] 예산

개발조각 2022. 2. 9. 16:03
728x90
반응형

2021.10.06에 푼 문제입니다.

 

예산 문제는 진짜 이상하다 정도로 안풀렸는데 막상 답을 알게 되니까 왜 못풀었지 싶더라고요😓

 

 


해결방안

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

    for (let i of d) {
        if (i > budget) {
            break;
        } else {
            budget -= i;
            answer += 1;
        }
    }
    return answer;
}

 

해결방안 순서

  1. d 배열 오름차순으로 정렬하기
  2. for of를 이용해 d 배열의 원소의 갯수 만큼 반복 한다. 
  3. for of 안에서 budget의 d 배열의 원소를 만큼 빼주고, answer에서는 1씩 더해준다.

3단계는 3단계 설명에서 자세하게 쓰겠습니다.

 

 

1단계. d 배열 오름차순으로 정렬하기

이번 문제는 "최대 몇 개의 부서에 물품을 지원할 수 있는지"를 구하는 문제입니다.

최대로 물품을 지원하기 위해서는 금액이 적은 것 부터빼면 최대한 많은 물품을 지원할 수 있도록 했습니다.

그래서 d배열을 오름차순 해주었습니다.

 

d.sort((a,b) => a - b);

MDN Web Docs
sort() 메서드는 배열의 요소를 적절한 위치에 정렬한 후 그 배열을 반환합니다.

구문 : 배열.sort(정렬 순서를 정의하는 함수)

 

sort() 메서드로는 오름차순과 내림차순으로 정렬할 수 있습니다.

프로그래머스에서 자주 사용하니까 꼭 외우시길 바랍니다.!!

  • sort((a,b)=>a-b); -> 오름차순
  • sort((a,b)=>b-a); -> 내림차순

전에도 얘기했다 싶이 sort() 만 쓰시면 제출 수 채점하기에서 오류나옵니다.

 

테스트 1 : d = [1,3,2,5,4]; budget = 9;
d.sort((a,b) => a - b); -> d=[1,2,3,4,5]

테스트 2 : d = [2,2,3,3]; budget = 10;
d.sort((a,b) => a - b); -> d=[2,2,3,3]

 

2단계. for of를 이용해 d 배열의 원소의 갯수 만큼 반복 한다.

이번 문제는 원소를 바로 사용하는게 더 빠르겠다 싶어서 for문이 아닌 for of문을 사용해 주었습니다.

 

for (let i of d){}

MDN Web Docs
for...of 명령문은 반복가능한 객체 (Array, Map, Set, String, TypedArray, arguments 객체 등을 포함)에 대해서 반복하고 각 개별 속성값에 대해 실행되는 문이 있는 사용자 정의 반복 후크를 호출하는 루프를 생성합니다.

구문 :

for (variable of iterable) {
  statement
}

  • variable : 각 반복에 서로 다른 속성값이 variable에 할당됩니다.
  • iterable : 반복되는 열거가능(enumerable)한 속성이 있는 객체.

MDN에서는 이렇게 설명하지만 간단하게 설명하자면

for...of는 배열 값 순환이라하면 쉽게 이해하실 수 있습니다.

const arr = ['a', 'b', 'c'];

for (const element of arr) {
  console.log(element);
}
// "a"
// "b"
// "b"
테스트 1 : d = [1,3,2,5,4]; budget = 9;
d.sort((a,b) => a - b); -> d=[1,2,3,4,5]
for (let i of d){} -> i = 1, i = 2, i = 3, i = 4, i = 5 까지 반복

테스트 2 : d = [2,2,3,3]; budget = 10;
d.sort((a,b) => a - b); -> d=[2,2,3,3]
for (let i of d){} -> i = 2, i = 2, i = 3, i = 3 까지 반복

 

3단계. for of 안에서 budget의 d 배열의 원소를 만큼 빼주고, answer에서는 1씩 더해준다.

여기서 구해야 되는 것은 "최대 몇 개의 부서에 물품을 지원할 수 있는지"를 구해야 됩니다.

 

for (let i of d) {
        if (i > budget) {
            break;
        } else {
            budget -= i;
            answer += 1;
        }
    }
    return answer;
}

for of에서는 d배열의 값을 순환합니다.

이점을 활용하여  "최대 몇 개의 부서에 물품을 지원할 수 있는지"를 구해야 되는데요.

그러기 위해서 for of안에는

  1.  budget(예산) - 오름차순으로 정렬된 d배열(각 부서에서 신청한 금액)의 원소 = 부서가 원하는 금액 빼주기
  2.  budget - d배열을 뺀 횟수를 구해주기 = 지원 가능 부서 하나씩 더하기

을 넣어주어야 됩니다.

 

여기서 중요한 점!!!

"budget - d배열의 원소" = "마이너스(-)"가 되면 안되겠죠?

그래서 1단계에서 배열은 오름차순으로 정렬한거고 if else문을 써주는 겁니다.

그래서 i > budget경우에만 앞에 1,2번을 실행할 수 있게 해줍니다.

 

테스트1로 설명

d = [1,3,2,5,4]; budget = 9;

1단계에서 정렬된 d배열 d=[1,2,3,4,5]

 

for of문 i=1일 때

i > budget -> 1>9 false -> else문으로

budget -= i; -> 9 - 1 = 8
answer += 1; -> 0 + 1 = 1

budget = 8;

 

for of문 i=2일 때

i > budget -> 2>8 false -> else문으로

budget -= i; -> 8 - 2 = 6
answer += 1; -> 1 + 1 = 2

budget = 6;

 

for of문 i=3일 때

i > budget -> 3>6 false -> else문으로

budget -= i; -> 6 - 3 = 3
answer += 1; -> 2 + 1 = 3

budget = 3;

 

for of문 i=4일 때

i > budget -> 4>3 true -> if문으로

break;

return answer; -> answer = 3


여기까지 프로그래머스 예산 해결방안에 대해 설명해보았습니다.

728x90
반응형