일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- grpahQL
- ftech
- Instantiation Patterns
- 코드스테이츠
- DOM
- 클라이언트
- vscode
- 연습
- 포스기
- array
- 리액트
- react
- underbar
- 취업
- 엔퀸즈
- 개발
- 일상
- underscores
- JavaScript
- 자바스크립트
- 코딩
- 알고리즘
- 공부
- this
- method
- nqueens
- 제일어려워
- 해커톤
- 초보
- JS
- Today
- Total
analogcoding
algorithm 연습6 본문
문제. 인자로 받는 숫자의 각 자릿수를 반복적으로 곱해서 한자리수로 만들 때까지의 곱한 수를 리턴.
Ex) 39 => 3.
ㄴ 한자리 수가 될 때까지 반복 곱셈 : 3 * 9 = 27 => 2 * 7 = 14 => 1 * 4 = 4 . 총 3번 곱셈.
해결방안.
1-1. input num을 문자열로 바꾼 뒤 나눠서 각 자릿수를 곱할 수 있게 만듬.
1-2. 한자리수가 될 때까지 곱하는 조건을 while문으로 주고 곱할 때마다 카운트해서 카운트를 리턴.
2-1. 값이 0인 카운트를 전역변수로 생성.
2-2. input 숫자 num의 자릿수가 한 자리수라면 그대로 카운트를 리턴.
2-3. 아니라면 카운트++
2-4. input num을 문자열로 바꾼 뒤 나눠서 각 자릿수를 곱한 값을 인자로 재귀함수로 만들어서 리턴.
첫 번째 솔루션.
while문을 이용해서 해결하는 방법.
input num의 값을 문자열로 변환 후 배열로 나누어준다. 그리고 count 를 설정.
let arr = num.toString().split('');
let count = 0;
while 문의 조건을 arr 배열의 길이가 1 보다 클 경우 계속 반복 , 같거나 작아지면 종료되게 설정한다.
그 후 각 자리의 값을 reduce 함수를 이용해 반복적으로 곱해준다.
다시 반복할 수 있게 arr을 처음과 같이 변환하고 count++, while 문의 조건이 성립될 때까지 반복 실행한다.
while(arr.length > 1){
arr = arr.reduce(function(acc, curr){
return acc * curr; // => 3*9 = 27
});
arr = arr.toString().split(''); // => [2,7] 배열의 길이가 아직 1보다 크므로 while문 반복
count++;
}
return count;
}
결과확인
두 번째 솔루션.
재귀함수를 이용해서 값을 리턴하는 방법.
재귀 실행 시 최종리턴할 카운트를 위해 전역변수에 count 를 생성한다. count 의 값은 0.
input num이 10보다 작다면 한자리 수이므로 count 를 바로 리턴한다.
let count = 0;
var MultiplicativePersistence = function(num) {
if(num < 10){
return count
}
아니라면 count++, input num을 문자열로 바꾼 뒤 나눠서 각 자릿수를 곱한 값을 result 로 두고 result를 인자로 받는
재귀함수를 실행해서 반복한다.
count++
let arr = num.toString().split('');
let result = 1;
for(let i = 0; i < arr.length; i++){
result *= Number(arr[i])
}
return MultiplicativePersistence(result);
}
* 이 코드를 작성하면서 문제는 한 번만 값을 구한다면 상관이 없지만 연속으로 다른 값을 요청할 때 count의 값이 0 이 아닌 지난 실행된
값에 대한 결과로 남아있기 때문에 count를 초기화 시켜줄 함수를 하나 만들어서 재실행 시 restart 함수를 실행시킨 후 작동해야한다.
function restart(){
count = 0;
}
결과확인
while 문과 재귀함수 모두 자주 쓰던 방식이 아니지만 이 문제를 해결할 때 주관적으로 볼 때 나름 직관적이고 효율적인
코드를 작성할 수 있는 방법이었다고 생각한다. 재귀함수에 대해 다룰 때 예제로 사용할 예정!
'Study JS for me > Algorithm' 카테고리의 다른 글
Recursion 정의 + 예제 (0) | 2019.04.29 |
---|---|
algorithm 연습7 (0) | 2019.04.28 |
algorithm 연습5 (0) | 2019.04.27 |
algorithm 연습4 (0) | 2019.04.27 |
algorithm 연습3 (0) | 2019.04.26 |