-
[알고리즘/자바스크립트] 한 자리수가 될 때까지 곱하기 (Persistent Bugger)Algorithm 2019. 8. 3. 21:40
-해당 문제는 codewars사이트의 level6 문제입니다. (1~8단계 중 8단계가 가장 쉬운 레벨)-
Persistent Bugger
Write a function, persistence, that takes in a positive parameter num and returns its multiplicative persistence, which is the number of times you must multiply the digits in num until you reach a single digit.
For example:
persistence(39) === 3 // because 3*9 = 27, 2*7 = 14, 1*4=4 // and 4 has only one digit persistence(999) === 4 // because 9*9*9 = 729, 7*2*9 = 126, // 1*2*6 = 12, and finally 1*2 = 2 persistence(4) === 0 // because 4 is already a one-digit number
어떤 숫자가 input으로 들어왔을때, 그 숫자가 한 자리수가 될 때까지 각 자리수의 곱을 계산한다.
몇 번의 연산만에 한 자리수가 되었는지를 카운트하여 리턴한다.
내가 먼저 생각한 방법은 재귀를 이용하여 푸는 것이었다.
숫자를 문자열로 만들어 split()함수로 배열로 쪼갠 다음,
reduce() 메소드를 사용하여 각 자리수를 곱한 값을 리턴하는 multiply 함수를 만들었다.
그리고 숫자가 10보다 작으면 초기값이 0인 count를 리턴하고
만약 10보다 크거나 같으면 count의 값을 1증가시킨 후
각 자리수의 곱한 값을 인자로 하여 recurse() 함수를 다시 실행시킨다.
function persistence(num) { const multiply = (n) => ('' + n).split('').reduce((acc, cur) => acc * cur); let count = 0; return (function recurse (num) { if (num < 10) { return count; } count++; return recurse(multiply(num)); })(num); }
더 간단한 풀이는 while문을 이용하여 반복으로 푸는 것이다.
숫자가 한자리수가 될 때까지 숫자를 자리수마다 곱하고,
1자리수가 되면 count를 리턴한다.
위 코드보다 훨씬 더 간단해졌다!
function persistence(num) { let count = 0; while (num > 9) { count++; num = ('' + num).split('').reduce((acc, cur) => acc * cur); } return count; }
반응형'Algorithm' 카테고리의 다른 글
[알고리즘/자바스크립트] 반복되지 않는 첫 알파벳 찾기 (First non-repeating character) (609) 2019.08.04 [알고리즘/자바스크립트] 알파벳 스크램블 (Scramblies) (484) 2019.08.03 [알고리즘/자바스크립트] 트리에서 잎노드 개수 구하기 (Tree Count Leaves) (484) 2019.07.23 [알고리즘/자바스크립트] 뒤집어진 연결 리스트 (Reverse Linked List) (609) 2019.07.18 [알고리즘/자바스크립트] 아나그램 판별하기 (is Anagram) (609) 2019.07.16 COMMENT