🚀 문제를 풀어나갈 때 생각의 흐름을 정리합니다. 또한 새로운 풀이에 대한 코드를 분석하고 모르는 부분에 대해서 정리합니다. 생각이 다른 부분에 대한 피드백은 언제나 환영합니다. 틀린 내용에 대한 피드백 또한 항상 감사합니다.
Task:
Your task is to write a function which returns the sum of following series upto nth term(parameter).
Series: 1 + 1/4 + 1/7 + 1/10 + 1/13 + 1/16 +...
Rules:
Examples:
SeriesSum(1) => 1 = "1.00"
SeriesSum(2) => 1 + 1/4 = "1.25"
SeriesSum(5) => 1 + 1/4 + 1/7 + 1/10 + 1/13 = "1.57"
NOTE: In PHP the function is called series_sum().
👉 문제해석
난이도가 낮은 문제들은 기본적으로 문제에서 식을 주어지는 경우가 많은 것 같다. 어제 풀었던 문제와 마찬가지로 이 문제도 식을 주고 그 식을 일반화하여 코드로 구현하면 되는 문제이다. Series: 1 + 1/4 + 1/7 + 1/10 + 1/13 + 1/16 +...
이 식을 일반화하여서 조건에 맞게 값을 리턴하면 된다.
첫번째 생각 : 주어진 식에 대한 규칙을 찾았다. 분모가 3씩 커지는 등차수열을 생각하였다.
function SeriesSum(n) {
let sum = 0.00;
for(let i = 0; i < n; i++){
sum += 1/(3*i+1);
}
return String(sum.toFixed(2));
}
이번 문제는 best solution과 clever solution이 모두 비슷하게 접근하였기 때문에 딱히 적을게 없었다. 그런데 newest solution 부문을 보던 중, 자바스크립트에서 처음보는 구문이 보여 당혹스러워서 이렇게 적게 되었다.
function SeriesSum(n, sum = 0) {
return n ? SeriesSum(n-1, sum + 1/(1+3*(n-1))) : sum.toFixed(2)
}
function multiply(a, b){
return a * b;
}
multuple(5 * 2); //10
multiple(5); //NaN!
기본적으로 자바스크립트의 매개변수 값은 undefined이다. 그렇기 때문에 인자가 5만 들어온 경우엔 비어있는 나머지 인자가 자동으로 undefined가 되어서 결과값이 NaN이 되는 것이다. 이와 같은 현상을 막기위해서 과거에는 매개변수에 값이 할당되지 않을 경우를 대비하여 인위적으로 값을 할당해주는 방식을 사용하였다.
//ES5
function multiply(a, b){
if(b === undefined) //값으로 비교 //if(typeof b === 'undefined') 타입으로 비교
b = b ? b : 1;
return a * b;
}
multuple(5 * 2); //10
multiple(5); //5
//ES6
function multiply(a, b = 1){
return a * b;
}
multuple(5 * 2); //10
multiple(5); //5
ES5에서는 인자로서 들어오지 않을 값을 생각해서 그에 대한 로직을 짜줘야 했지만, ES6에서는 단지 매개변수에 기본값을 적어줌으로서 인자가 들어오지 않는 경우를 해결할 수 있게 되었다. 마찬가지로 위의 풀이에서도
function SeriesSum(n, sum = 0)
식에서 sum의 기본값을 적어줌으로서 함수의 첫 호출에서 n만을 인자로 사용하는 상황을 해결할 수 있게 된 것이다.
지금 해결하고 있는 문제들은 굉장히 쉬운 문제들이다. 단지 예전에 풀던 언어와는 다른 언어로 접근하고 있을 뿐인데 매번 새로움을 느낀다.