1일 1코테 day 39 _ 예산

konut ko·2022년 9월 12일
0

문제

나의 풀이

unction solution(d, budget) {
    d.sort((a,b)=> a-b)
    let sum = 0
    let count = 0
    for(i in d){
        sum += d[i]
        if(sum> budget){break;}
        count += 1     
    }
    return count
}

지원부서 수가 많아지려면 잔잔바리 예산 신청한 부서부터 지원해주면 되므로
sort를 썼다.
이런 문제는 풀이법은 금방 떠오르지만 count 한 값이 return 되는 시점이 중요해서 오래걸린다.
count대신 index를 이용하고 싶었지만 for문에서는 배열d의 인덱스를 다 순회한 경우(모든 부서에 예산을 지원한 경우) 반환할 index가 애매해져서 그냥 count로 풀었다. 근데 생각해보니 for 문을 다 돈 경우엔 배열 d의 길이를 return하면 되는거네? 지금생각남...

넘의 풀이 1

function solution(d, budget) {
    return ~(~d.sort((a,b)=>a-b).map(v => budget -= v).findIndex(v => v < 0) || ~d.length);
}

오오 아이디어 괜찮다.

배열 d를 오름차순 정렬한 후 앞 요소 부터 예산에서 빼주고
빼준 값(예산 지원하고 남은 돈) v가 0보다 작을때 인덱스값(=직전 요소까지 지원 부서 수)반환한다.

*이 부분 신기
만약 map을 다 돌면 d.length 를 반환한다 (모든 부서에 지원했으니 배열의 길이가 곧 지원한 부서의 수가 되므로)
그런데 어떻게 d.length를 반환하냐??
findIndex 함수는 인덱스를 못찾으면 -1을 반환한다. 그럼 참인데 ~을 씌우면 0이 됨. 그럼 거짓이므로 || 뒤로 넘어가서 d.length를 반환하는 것!

** 이 부분은 더 신기
그럼 return 값에 ~과 map에 ~은 왜 씌웠냐??
|| 앞부분이 정상 값으로 리턴되면 ~이 씌워지기때문에 그걸 다시 벗겨내려고 마지막 괄호 밖에도 ~을 씌움 ~연속 두개는 없는것과 같은가 봄.
|| 뒷부분도 마찬가지로 ~~ 두번 쓰도록 ~씀.
결론적으로 ~은 ( || ) 괄호 안 또는의 앞부분 값이 -1일 때 뒤로 넘어가도록 쓴것.

아이디어는 좋은데 좀 불편한 풀이법이다...ㅋㅋㅋ

넘의 풀이 2

신박한데 댓보니 효율이 많이 떨어진다고 함
"반복할 때 마다 reduce 호출해서 검사하고 pop까지 해야돼서 효율성이 많이 떨어지네요" - 작성자

넘의 풀이 3 - 굿!!

+ ((budget -= price) >= 0)

이 부분이 boolean 계산의 값에 따라 0 또는 1이 된다고 ㄷㄷ

profile
보초딩코라 틀린 내용 있을 수도 있습니다. 댓글 지적 환영

1개의 댓글

comment-user-thumbnail
2022년 9월 13일

~ -1... 오 ... 잘 배워갑니다!

답글 달기