[TIL] 2020. 12. 05
문제 요약: 숫자 입력받아 각 자리를 변환하여 어떤 값 리턴해야함
(문제) 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
위 문제는 다음과 같이 쪼갤 수 있다.
- 입력받은 n을 각 자리를 요소로 하는 배열로 만든다.
- String(n).split('')
- [...String(n)]
- 각 요소를 exponent을 반영한 수로 바꾼다. 이 수는 1씩 더해지므로 reduce 메소드를 쓰기가 어려웠는데 레퍼런스 솔루션에 있었다. 난 powArr에 요소를 새롭게 push 해주었다.
- 여기서 reduce 대표 예제에 나오는 acc+cur를 적용한다.
- 정수이면 그대로, 아니면 -1을 리턴한다.
솔루션에서 배운 점
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
}
- reduce 메소드의 확장 가능성
간결한 코드는 감탄을 자아낸다. 나의 9줄이 솔루션은 2줄로 표현되었다. reduce 메소드를 더 잘 알고 있어야 저렇게 풀 수 있다.
- 삼항 연산자 사용
이 과정에서 % 연산자가 어떤 Boolean 값을 나타내는지 새롭게 알게 되었다.
따라서 솔루션에서 나머지가 있다면 true이므로 -1, false일 때 해당 값을 리턴한다.
Author And Source
이 문제에 관하여([TIL] 2020. 12. 05), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@from0/TIL저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)