프로그래머스 - 위클리 챌린지 1주차 : 부족한 금액 계산하기

less than 1 minute read

문제는 여기

부스트캠프 수료 후 이제 알고리즘 문제도 js로 풀어보려고 한다.

1차 솔루션

function solution(price, money, count) {
    const sum = [...Array(count)].map((v,i)=>i+1).reduce((acc,v)=>acc+=v,0);
    const answer = money - (price*sum);
    return answer > 0 ? 0 : -answer;
}

price*1 + price*2 + ... + price*n = price*(1+2+...n) 이다. 1+2+...+n 을 구하기 위해서 [1,2,...,n] 배열을 만들고 reduce를 이용했다.

  • [0,1,2,...,n] 와 같은 배열을 만드는 방법 (ES6)
const arr1 = Array.from({length:n},(v,i)=>i);
const arr2 = [...Array(n)].map((v,i)=>i);
const arr3 = [...Array(n).keys()].map(i=>i);

2차 솔루션

function solution(price, money, count) {
    const sum = [...Array(count)].reduce((acc,_,i)=>acc+=(i+1),0);
    const answer = money - (price*sum);
    return answer > 0 ? 0 : -answer;
}

reduce 함수의 매개변수로 넘기는 callback 함수는 인수로 accumulator, currentValue, currentIndex (optional), array(reduce를 호출한 배열, optional)를 받을 수 있는데, currentIndex 인수를 활용하면 map 사용없이도 합계를 구할 수 있다.

3차 솔루션

function solution(price, money, count) {
    const sum = (1 + count) * count / 2;
    const answer = money - (price*sum);
    return answer > 0 ? 0 : -answer;
}

다른 사람의 풀이에서 가우스 공식을 이용하는 방법을 배웠다. 가우스 공식은 1부터 n까지의 합을 구할 때 사용되는 공식이다. 중고등학생 때 배웠지만 미처 생각하지 못했다. 훨씬 깔끔하게 1부터 count까지의 합을 구할 수 있다.

210825174058.png

1+2+...+n = ((1+n)*n)/2

Reference

  • https://hjcode.tistory.com/73
  • https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
  • https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=im8080&logNo=60191789372