본문 바로가기
코딩 생활/코딩테스트

[프로그래머스 | JS] 레벨 1. 예산 (feat. 내부적인 오류....)

by everyhahaha 2023. 4. 14.

❓ 문제: 예산

 

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

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

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

📝 문제 풀이

reduce 메서드로 풀까 map 메서드로 풀까 고민하다가 

연산이 빠르고 보기 편한 for of 문으로 풀기로 했다.

 

// 처음 풀이
function solution(d, budget) {  
    let result = 0;
        
    for(const amount of d.sort((a, b) => a - b)) {
        if (budget < amount) break;
        budget -= amount;
        result++;
    }
    
    return result;
}

 

그런데 계속 내부적인 오류라고 잠시 후에 다시 해보라는 메세지가 떴다.

아무리 생각해도 무한 연산이 되는 부분은 없는 것 같은데...

심지어 기존 변수를 건드리면 안되는 건가 해서 복사본 변수를 만들어서 풀어봤지만 똑같았다.

 

그렇게 한 시간 남짓 계속 붙들고 있었다가...

질문하기 글 중에 budget이 0이 되면 반복문을 나오는 풀이가 있기에 한 번 적용해봤다

결과는 드디어 통과.....!!!!!!

 

// 수정한 풀이
function solution(d, budget) {  
    let result = 0;
        
    for(const amount of d.sort((a, b) => a - b)) {
        if (budget < amount || budget === 0) break;
        budget -= amount;
        result++;
    }
    
    return result;
}

 

그리고 다른 풀이를 구경해봤다.

// 다른 분의 풀이
function solution(d, budget) {  
    d.sort((a, b) => a - b)
        
    while(d.reduce((a, b) => (a, b), 0) > budget) d.pop();
    
    return d.length;
}

 

while의 조건문에 reduce 메서드를 넣는다니..!

역시 개발의 세계는 배움에 끝이 없어서 항상 새롭다.

다만 매번 메서드를 실행해야하는게 연산에 무리를 주지 않을까 해서 실행속도를 비교해봤다.

(왼쪽)while문 (중간)for of문-조건1개 (왼쪽)for of문-조건2개

 

while문의 속도는 예상과 다르게 생각보다 빨랐다. 물론 케이스마다 편차가 좀 있었다.

while문도 개안네...

 

for of문이 2개가 된 건 테스트 통과가 된 후 처음 풀었던 풀이로 제출했더니 통과돼서...........

내부적인 오류가 있다매....ㅠㅠ

덕분에 if문의 조건의 개수에 따라 속도가 달라지는 것도 확인해보고 좋다....^^


그리고 드디어,

프로그래머스에서 등수가 1만대에 들어섰다!

이 순간을 얼마나 기다려왔는지...

 

누가 시킨 건 아니지만 13만대에서 시작해서

계속 성장해왔구나를 스스로 확인하는 지표이기에 너무 만족스럽다.

앞으로도 조금 느리다고 생각되도 꾸준하게 나아가자.

모두 즐코하세요-!

댓글