The journey to becoming a developer

My future is created by what I do today, not tomorrow.

Algorithms/Programmers

[프로그래머스 Level 1] 3진법 뒤집기 (자바스크립트)

Millie 2021. 10. 21. 19:15

Description

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

Constraints

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

 

My Solution

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

// My solution 2
function solution(n) {
  return parseInt([...n.toString(3)].reverse().join(''), 3);
}

toString을 이용해 n을 3진법으로 변환한 후, split('') 또는 spread syntax를 이용해 배열로 만들어준다.

그 후 reverse()를 이용해 각 자릿수를 뒤집어 주고, join('')으로 문자열로 만든다.

이것을 parseInt 메서드를 이용하여 3진법인 수를 10진법으로 다시 변환한다. 


parseInt에 대해서 좀 더 알아보자. (출처 : JavaScript Deep Dive 333~336p)

parseInt

parseInt는 전달받은 문자열 인수를 정수로 parsing해서 반환한다.

parseInt(string, radix)의 형태로 쓰인다.

여기서 radix는 진법을 나타내는 기수를 말한다. 2~36을 전달할 수 있다. 

기수를 지정하면 첫 번째 인수로 전달된 문자열을 해당 기수의 숫자로 해석하여 반환한다.

반환값은 언제나 10진수이다. 

전달받은 인수가 문자열이 아니면 문자열로 반환한 다음, 정수로 해석해서 반환한다.

첫 번째 인수로 전달한 문자열의 첫 번째 문자가 해당 지수의 숫자로 변환될 수 없다면 NaN을 반환한다.

 

Other's Solutions

function solution(n) {
  const answer = [];
  while (n !== 0) {
    answer.unshift(n % 3);
    n = Math.floor(n / 3);
  }
  return answer.reduce((acc, v, i) => acc + v * Math.pow(3, i), 0);
}

toString과 parseInt를 쓰지 않고, 대신 while과 unshift 등 다른 메서드를 이용한 풀이이다. 

 

function solution(n) {
  let res = [];

  const run = num => {
    if (num < 3) {
      res.push(num);
      return;
    }
    res.push(num % 3);
    return run(Math.floor(num / 3));
  };

  run(n);

  return res
    .map((a, i) => a * 3 ** (res.length - 1 - i))
    .reduce((r, a) => r + a);
}

재귀함수를 활용한 풀이이다.