(문제) function digPow(n, p) 에서 숫자를 입력받아 각 자리에 p제곱, (p+1)제곱, (p+2)제곱 이런 식으로 해서 각 항을 모두 더한다. 그렇게 나온 총합을 n으로 나눴을 때 정수면 리턴하고, 그렇지 않으면 -1을 리턴.
같은 문제를 두고도 풀이가 이렇게 다를 수 있다는 걸 알았다. 내가 제출한 답은,
function digPow(n, p){
let arr = [...String(n)].map(el => parseInt(el));
let powArr = [];
for (let i = 0 ; i < arr.length ; i++) {
powArr.push(arr[i] ** (p+i));
}
let result = powArr.reduce((acc, cur) => (acc+cur)) / n;
if (Number.isInteger(result)) {
return result;
}
return -1;
}
// 0. n -> String -> 배열 -> 각 요소를 정수로 전환
// 1. 1stNum ** p
// 2. 2ndNum ** p+1
// 3. 3rdNum ** p+2
// ... finally, return acc / n
위 문제는 다음과 같이 쪼갤 수 있다.
function digPow(n, p) {
var x = String(n).split("").reduce((s, d, i)
=> s + Math.pow(d, p + i), 0)
return x % n ? -1 : x / n
}
간결한 코드는 감탄을 자아낸다. 나의 9줄이 솔루션은 2줄로 표현되었다. reduce 메소드를 더 잘 알고 있어야 저렇게 풀 수 있다.
이 과정에서 % 연산자가 어떤 Boolean 값을 나타내는지 새롭게 알게 되었다.
따라서 솔루션에서 나머지가 있다면 true이므로 -1, false일 때 해당 값을 리턴한다.