본문 바로가기
알고리즘/CodeWars

[CodeWars] javascript - 6kyu - Sum of Digits / Digital Root 문제풀이

by TLOWAC 2020. 4. 12.

Title

Sum of Digits / Digital Root

Description

In this kata, you must create a digital root function.

A digital root is the recursive sum of all the digits in a number. Given n, take the sum of the digits of n. If that value has more than one digit, continue reducing in this way until a single-digit number is produced. This is only applicable to the natural numbers.

Here's how it works:

digital_root(16)
=> 1 + 6
=> 7

digital_root(942)
=> 9 + 4 + 2
=> 15 ...
=> 1 + 5
=> 6

digital_root(132189)
=> 1 + 3 + 2 + 1 + 8 + 9
=> 24 ...
=> 2 + 4
=> 6

digital_root(493193)
=> 4 + 9 + 3 + 1 + 9 + 3
=> 29 ...
=> 2 + 9
=> 11 ...
=> 1 + 1
=> 2

How Can I Solved

문제 요구사항 정의

digital_root() 함수에 입력된 숫자를 하나씩 나눈뒤 더하여,
그 값이 한자리 수가 될 때 까지 digital_root를 반복하라.

문제 접근

함수의 실행된 결과값을 다시 함수의 인자로 넣어줘야 하므로, 재귀함수이다.

최종적으로 출력되는 값은 < 10 이다.

삼항연산자의 조건은 인자로 들어오는 값이 10 이상인 경우, 인자값을 계산하여 재귀함수를 실행한다.
인자로 들어오는 값이 10 미만인 경우, 최종값으로 반환한다.

(n+='')

digital_root() 함수의 인자로 들어온 숫자 n 을 문자로 바꿔, split() 메서드 사용이 가능하게 만든다.

// n=12345 => n='12345'

.split('')

split('') 메서드를 사용하여, 문자열이 된 숫자를 하나하나씩 나누어 준다.

// n='12345' => ['1','2','3','4','5']

.map(x=> x=x*1)

배열에 문자 형태로 담겨져있는 요소들에 각각 * 1을 하여, '문자'에서 숫자로 변경한다.

// n='12345' => ['1','2','3','4','5']

reduce((a,b)=>{return a+b})

배열 [1,2,3,4,5] 의 총합을 구한다.

// [1,2,3,4,5] => 1+2+3+4+5 =>15

Solution

function digital_root(n) {
   return n>=10 ?
   (n=(n+='').split('').map(x=> x=x*1).reduce((a,b)=>{return a+b}),
   digital_root(n)) :
   n
}

댓글