analogcoding

algorithm 연습6 본문

Study JS for me/Algorithm

algorithm 연습6

be well 2019. 4. 28. 17:27

문제. 인자로 받는 숫자의 각 자릿수를 반복적으로 곱해서 한자리수로 만들 때까지의 곱한 수를 리턴.

 

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
Comments