[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일 때 해당 값을 리턴한다.

좋은 웹페이지 즐겨찾기