본문 바로가기
기초다지기/JS 코딩테스트

javascript 배열 조합 문제

by 김빵그 2023. 11. 2.

문제 

부서별로 물품을 구매하는데 필요한 예산과 예산 총액이 주어졌을때 최대한 많은 부서에 물품을 지원하려는 상황, 각 부서가 필요한 예산을 d 총예산이 budget이 주어지며 최대한 많은 부서에 물품을 지원할 수 있는 최대 개수를 반환

나의 풀이 

function solution(d, budget) {
    var answer = 0;
    d.sort((a, b) => a - b);
    console.log(d)
    for(let i = 0; i < d.length; i++) {
        budget -= d[i];
        console.log(budget)
        if (budget < 0) {
            break;
        }
        answer++;
    }
    return answer;
   
    
}
  • 각 부서 예산 d 배열을 오름차순으로 정렬하여 가장 예산을 적게 요구하는 부서부터 처리한다
  • 반복문을 통해 배열의 d 요소를 처리한다 예산을 부서의 요청 예산 d[i]만큼 차감하고 예산이 음수가 되면 반복문 종료
  • 반복문이 종료될 때까지 answer 1씩 증가시킨다

사실 감이 안와서 힌트 계속 봄.. 

다른 풀이

1) reduce

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

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

    return d.length;
}
  • d 오름차순 
  • while 루프를 사용하여 배열의 d 합이 주어진 예산 budget을 초과하는 경우 해당하는 부서를 pop을 사용해 배열에서 제거한다
function solution(d, budget) {
    return d.sort((a, b) => a - b).reduce((count, price) => {
        return count + ((budget -= price) >= 0);
    }, 0);
}
  • sort 사용하여 오름차순 정렬 
  • reduce를 사용하여 배열 d 반복 count 초기값 0으로 설정하고 각 요소 price를 처리한다 
  • count에서는 현재까지 지원한 부서의 수가 저장되고 price는 현재 부서 예산 요청을 나타낸다 
  • bugdet에서 price 차감하고 차감후의 예산이 0 이상인 경우 해당 부서에 지원할수 있는 것으로 판단해 +1