[알고리즘] 프로그래머스 - 예산

do_large·2020년 10월 14일
0

알고리즘

목록 보기
5/50
post-thumbnail

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

제한사항

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

풀이방법
1. 배열을 오름차순으로 정렬
2. 총 예산에서 배열의 index순서대로 값을 빼준다.
3. 값을 빼면 count 값을 1 증가시킨다.
4. 예산이 뺄 값보다 작아질때 break

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

문제를 제출했을때 계속 정답율이 50% 였는데 그 이유가 sort()를 잘못 사용해서였다

sort()

var score = [4, 11, 2, 10, 3, 1]; 

/* 오류 */
score.sort(); // 1, 10, 11, 2, 3, 4 
              // ASCII 문자 순서로 정렬되어 숫자의 크기대로 나오지 않음

위의 예시처럼 sort메서드를 그냥 사용하게되면 아스키코드 순서대로 정렬되어 숫자의 오름차순으로 정렬되지않는다
이 부분을 몰랐기때문에 내 코드가 어디가 잘못된지 몰랐다.

숫자를 오름차순으로 정렬하려면

score.sort(function(a, b) { // 오름차순
    return a - b;
    // 1, 2, 3, 4, 10, 11
});

score.sort(function(a, b) { // 내림차순
    return b - a;
    // 11, 10, 4, 3, 2, 1
});

이런 식으로 값을 비교해주는 익명함수를 인자로 줘야한다.

0개의 댓글