3진법 뒤집기(Javascript)

·2022년 9월 21일
0
post-thumbnail

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

제한사항

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

입출력 예

nresult
457
125229

입출력 예 설명

입출력 예 #1

답을 도출하는 과정은 다음과 같습니다.

n (10진법)n (3진법)앞뒤 반전(3진법)10진법으로 표현
45120000217

따라서 7을 return 해야 합니다.

입출력 예 #2

답을 도출하는 과정은 다음과 같습니다.

n (10진법)n (3진법)앞뒤 반전(3진법)10진법으로 표현
1251112222111229

따라서 229를 return 해야 합니다.

나의 풀이

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

원래 toString()은 값을 문자열로 바꿔주는 함수인데, 기수(radix)를 매개변수로 받아 다른 진수로 변환해줄 수 있다. toString(3)은 3진법으로 바꿔달라는 이야기이다. 3진법으로 바꾼 후, split('')으로 문자 배열로 만들어준 다음 뒤집어서 합쳤다.

이후 parseInt()함수 안에 넣어 줬다. 아까 한 것처럼 toString()에다가 넣으면 현재 함수를 10진법으로 바꿔달라는 이야기이므로 값이 다시 10진법으로 변환되지 않는다. 그래서 toString()의 인수가 변환될 진수라면 parseInt()의 인수는 현재 문자열의 진수이다. 그래서 parseInt(문자열, 3)은 현재 문자열이 3진수라는 의미이고, 이 3진수를 10진수로 바꿔 준다.

참고할 풀이1

const solution = (n) => {
    return parseInt([...n.toString(3)].reverse().join(""), 3);
}

전반적으로 내가 푼 방식과 유사하긴 하지만, spread operator(전개 연산자)를 사용해 줬다. [...n.toString(3)] 이렇게 써 주면, 숫자를 3진법 문자로 만들어 준 뒤 문자 하나씩 분리하여 배열에 넣어 준다.

특징적인 점은 숫자 1200는 전개연산자가 나누지 못하지만, 1200이라는 문자는["1","2","0","0"] 이런 식으로 나눠서 배열에 들어가게 된다.

참고할 풀이 2

function solution(n) {
    const answer = [];
    while(n !== 0) {
        answer.unshift(n % 3);
        n = Math.floor(n/3);
    }
  	//3으로 나눈 나머지를 맨 앞으로 보내주고, 몫은 다시 while문에서 돌면서 몫을 내림한 수가 0이 아닐 때까지 반복해준다. 
    return answer.reduce((acc,v,i) => acc + (v * Math.pow(3, i)),0);   
}//3의 i제곱을 더해서 돌려준다. 

숫자로 푸는 방법이다. Math.pow()는 제곱을 구하는 함수이다. Math.pow(3, 2)라면 3의 제곱인 9를 출력해 준다.

profile
전 이것도 몰라요

0개의 댓글

관련 채용 정보