[프로그래머스] 3진법 뒤집기 - JS

예슬·2021년 2월 5일
1

Algorithm study

목록 보기
4/11
post-thumbnail

문제


풀이

  • 3진법을 계산한다.
    - 재귀함수로 구현, 재귀함수 반환이 아닌 함수 흐름에 따라 문자열에 추가하게 만들면 reverse 과정을 두지 않아도 된다.
  • 10진법을 계산한다.
    - 자리에 맞추어 3의 제곱 형식을 따라야 하기 때문에 Math.pow()와 str.length-i-1를 활용했다.

개선된 풀이

다른 사람의 코드를 구경하다가, 새로운 사실을 3가지씩이나 알게되었다.

JavaScript의 toString()에는 놀라운 기능이 있는데, toString()의 인자로 숫자를 넣어주면, 그 수의 기수(radix)를 반환한다.

JavaScript를 사용하면서 문자열을 반전시키고 싶을 때는 reverse()를 사용하면 되는데, 이 메소드는 배열에서 동작하므로 split("")을 사용하여 분리를 먼저 해주면 된다.

JavaScript의 parseInt()는 toString()과 동일하게 인자를 사용하여 radix값을 반환받을 수 있다.

이 지식을 토대로 문제의 순서대로 코드를 풀면 된다.
1. 입력받은 수를 toString(3)
2. split("")
3. reverse()
4. 배열이므로 join("") -> 참고로 join()은 배열 사이에 쉼표가 들어가게된다.
5. parseInt( , 3)

제출한 코드

개선되지 않은 코드

let str = '';

function make3(n){ // 3진법 계산 함수
    if(n<3){
        str = str+String(n);
        return;
    }
    else{
        str = str + String(n%3)
        make3(parseInt(n/3));
    }
}

function make10(str){ // 10진법 계산 함수
    let num = 0;
    for(let i=(str.length-1); i>=0; i--){
        let p = str.length-i-1;
        if(p == 0) num += Number(str[i])
        else{
            let n = Math.pow(3, str.length-i-1)
            num += Number(n* str[i])
    
        }
    }
    return num;
}

function solution(n) {
    make3(n);
    return make10(str);
}

개선된 코드

function solution(n){
    return parseInt(n.toString(3).split("").reverse().join(''), 3)
}

저렇게 긴 코드를 한 줄로 줄일 수 있다니 무척 놀랍다.

profile
블로그 이사 했습니다! 🏠 ⤵

0개의 댓글