본문 바로가기
알고리즘 스터디/프로그래머스 스킬체크 레벨 1(끝)

[프로그래머스 스킬체크 레벨 1] 3진법 뒤집기 풀이 및 설명 - 자바스크립트[JavaScript]

by 레일라오리덕 2021. 7. 18.
728x90

https://programmers.co.kr/learn/courses/30/lessons/68935

 

코딩테스트 연습 - 3진법 뒤집기

자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요. 제한사항 n은 1 이상 100,000,000 이하인 자연수

programmers.co.kr

 

문제

 

자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.

 

 

제한 사항

  • n은 1 이상 100,000,000 이하인 자연수입니다.

결괏값 예시

 

n result
45 7
125 229

 

기본 제공 틀

 

function solution(n) {
    var answer = 0;
    return answer;
}

 

풀이 [JavaScript]

 

3진법으로 변환하는 정석대로 아래 로직을 짜보았습니다.

우선 나머지값을 remain이라는 변수에 넣어주고, 몫이 0이 될 때까지 n을 계속 3으로 나누어주었습니다.

그렇게 몫이 0이되고 나머지 값들을 arr라는 배열에 넣어주면, 45를 예를 들면, arr = [0, 0, 2, 1] 이라는 값이 나오게 됩니다.

그럼 3의 3승, 3의 2승, 3의 1승, 3의 0승 순으로 3의 제곱수를 넣어주어야하기 때문에, arr의 인덱스와 1보다 작은 값을 3승 해주고 그 값에 각 배열의 값들을 곱해주면 됩니다.

즉, 3의 3승 * 0 + 3의 2승 * 0 + 3의 1승 * 2 + 3의 0승 * 1 = 0 + 0+ 6 + 1 = 7이 됩니다.

function solution(n) {
    var remain = 0;
    var result = 0;
    var arr = [];
    while(n > 0){
        remain = n%3;
        n = Math.floor(n/3); 
        arr.push(remain);
    }
    return arr.reduce((a, v, i) => a + Math.pow(3, arr.length-i-1) * v, 0);
}

 

728x90

위의 방법은 너무 복잡하고, 아래는 toString과 parseInt의 진법 변환 방식대로 풀이를 해보겠습니다.

우선, 45.toString(3)은 45를 3진법으로 바꾸어주고, 그 값을 split함수로 이용하여 [1, 2, 0, 0]이라는 배열을 만들어, 다시 reverse함수로 뒤집어줍니다. 

그러면 join함수로 뒤집힌 배열을 문자열로 변환하면 0012라는 값이 나오는데, parseInt를 이용하여, 0021이라는 3진법 문자열을 10진법 숫자로 변환해주면, 7이라는 십진법 숫자가 나오게됩니다.

이렇게 toString과 parseInt로 간단하게 해결할 수 있는 문제였습니다.

 

n.toString(원하는진법) => n이라는 숫자가 원하는 진법으로 변환된 문자열로 결과가 나오게 됩니다. 

n.toString()은 n.toString(10)이 default값으로 들어가 있는 것입니다.

 

parseInt(n, n의 진법) => n이라는 문자가 어떤 진법으로 들어있고, 이 값을 십진법의 숫자로 변환해줍니다.

 

파라미터값이 굉장히 헷갈릴 수 있는데, 문자열을 기준으로 진법이 들어간다고 기억하면 좋을 것 같습니다.

n.toString(원하는진법) => toString함수는 숫자를 문자열로 바꾸어줍니다. 결국, 반환되는 값이 문자열이므로,  이 값이 어떤 진법이길 바라는지 적으면 됩니다.

parseInt(n, n의 진법) => parseInt함수는 문자를 숫자로 바꾸어줍니다. 결국, 들어온 값이 문자열이므로, 이 값이 어떤 진법으로 명시되어 있는지 적으면 됩니다.

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

채점 결과 [JavaScript]

 

728x90

댓글