관리 메뉴

Jerry

프로그래머스 자바스크립트 - 3진법 뒤집기 본문

Problem Solving/Algorithm 문제 풀기

프로그래머스 자바스크립트 - 3진법 뒤집기

juicyjerry 2021. 6. 13. 20:06
반응형

 

 

Pseudo Code

/*

1. n을 3진법으로 변환

- n이 0이 될 때까지, 나누어준다.

- 각 나머지를 문자열로 만들어 unshift로 더해준다.

 

2. 1의 결괏값 뒤집기

- reverse를 이용한다.

 

3. 2의 결과값, 10진법으로 변환

- 결과값의 마지막 요소부터 첫 번째 요소 순으로 탐색한다. (각 요소는 전 요소의 제곱)

- 각 요소의 값 * (3^idx)

- sum 변수를 이용해서 각 요소의 값을 누적값을 만든다.

 

4. 3의 결과값을 반환

*/

 

 

 

First Try

테스트 10이 통과가 안 되었다. 

찾아보니, 큰 수가 들어올 경우에 sum이 너무 커진 게 문제였다.

 

Because JavaScript's numbers are IEEE-754 double-precision binary floating point (frequently known as "double"). They have only about 15 digits of decimal precision.

출처: https://stackoverflow.com/questions/38372658/why-does-javascript-number-function-return-wrong-value-for-this-number

 

function solution(n) {
  let remainder = [];
  while (n >= 1) {
    remainder.unshift(Math.floor(n % 3));
    n = n / 3;
  }

  remainder = parseInt(remainder.reverse().join(''));
  let len = remainder.toString().length;
  let sum = 0;
  remainder = remainder.toString().split("");

  for (let i = len - 1; i >= 0; i--) {
    sum += remainder[i] * 3 ** i;
  }

  return remainder;
}

 

 

 

Second Try

굳이 reserve 메서드를 사용할 필요가 없었다.

하지만, 또 다른 테스트 케이스가 통과가 안 되었다.

 

//!#2
function solution(n) {
  let remainder = [];
  while (n >= 1) {
    remainder.unshift(Math.floor(n % 3));
    n = n / 3;
  }

  remainder = parseInt(remainder.join(""));
  let len = remainder.toString().length;
  let sum = 0;
  remainder = remainder.toString().split("");

  for (let i = 0; i < remainder.length; i++) {
    sum += remainder[i] * 3 ** i;
  }

  return sum;
}

 

 

 

 

Last Try

나머지를 담는 배열 remainder를 문자열로 바꾸고,

while문에서 원래 '+='를 이용하면 순차적으로 더해지는데, 대신에 풀어서 순서를 조절할 수 있게 했다.

누적 값은 reduce를 이용했다.

 

//!#3
function solution(n) {
  let remainder = "";
  while (n) {
    let r = n % 3;
    remainder = r + remainder;
    n = Math.floor(n / 3);
  }
  return remainder
    .split("")
    .reduce((acc, cur, idx) => acc + Number(cur) * 3 ** idx, 0);
}

 

 

 

반응형