[알고리즘] 3진법 뒤집기 (JavaScript)

yeon·2023년 4월 11일
0

첫 시도

접근 방식

1. n을 3진법으로 바꾸는 과정에서 배열 안에 (3진법으로 변환한) 각 숫자를 넣는다.
 1-1. 나머지 변수(remain)를 let으로 선언한 후 while 문을 돌려서 나머지 변수에 n % 3을 할당한다.
 1-2. 이후 while문 안에서 n이 0이나 1, 2가 될 때까지 나누고 소수점은 버린다.
 1-3. 나머지 변수(remain)를 배열에 push한다.
 1-4. n이 계속 나눠져서 0이나 1, 2가 될 경우 배열에 0이나 1, 2가 된 값을 push한 후 while문을 빠져나온다.

2. 배열에서 각 숫자를 꺼내서 10진법으로 계산한다.
 2-1. for문을 돌려서 배열의 i번째 요소가 맨 마지막 요소라면 -> 그냥 answer에 더하고,
 2-2. 배열의 i번째 요소가 맨 마지막 요소가 아니라면 -> 3의 제곱을 곱한 후 answer에 더한다.

Code

  • 이렇게 작성했더니 런타임 에러가 났다.
function solution(n) {
    const arr3 = [];
    let remain;

    while (n >= 0) {
        remain = n % 3;
        n = Math.floor(n / 3);
        arr3.push(remain);
        if (n === (0 || 1 || 2)) {
            arr3.push(n);
            break;
        }
    }

    let answer = 0;

    for (let i = 0; i < arr3.length; i++) {
        if (i !== arr3.length - 1) {
            answer += +arr3[i] * 3 ** (arr3.length - 1 - i);
        } else {
            answer += arr3[arr3.length - 1];
        }
    }

    return answer;
}

최종 풀이

function solution(n) {
    const arr3 = [];
    
    while( n > 0){
        const remain = n % 3
        n = Math.floor(n / 3)    
        arr3.push(remain)
    }

    let answer = 0;
    
    for(let i = 0; i < arr3.length; i++){
        const idx = arr3.length - 1 - i;
        answer += +arr3[i] * (3 ** idx)
    }

    return answer  
}
  • 생각해보니 remain이 0이 나오는 것이 n이 0이 되는 거랑은 상관이 없고, 애초에 n이 0이 될 때까지 나눌 수가 없어서(최소가 1임), while문 조건을 0까지로 변경했다.
  • 아래 for문 블록도 굳이 if문을 통해 인덱스(i)가 arr3의 마지막 요소인지를 판별할 필요가 없어서(어차피 idx에서 -i가 있으니까 마지막엔 0이 되므로 굳이 if문으로 나눌 필요가 없다) 바로 answer에 값을 담는 것으로 수정했다.

다른 사람의 풀이

const solution = (n) => {
    return parseInt([...n.toString(3)].reverse().join(""), 3);
}
  • Number.toString() 메서드가 number 타입을 string 타입으로 바꿔주는 걸로만 알고 있었는데, 진법을 표현할 수 있었다..!
  • parseInt()도 숫자로 변환만 해주는 메소드인 줄 알았는데, 얘도 진법 지정이 가능했다.
  • 메서드 공부할 때 MDN을 꼼꼼히 보는 습관을 들이자!

참고 레퍼런스

진법 관련 학습 링크

0개의 댓글