[프로그래머스] 3진법 뒤집기

ppyororong_0_0·2022년 1월 13일
0

프로그래머스

목록 보기
6/19

[프로그래머스 - 1단계] 3진법 뒤집기 문제

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

📝 문제 설명

자연수 n의 3진법 구하고, 앞 뒤로 반전시킨 후,
그 3진법을 다시 10진법으로 변환한 값 return

💡 풀이

1. 재귀를 통해 n을 3진법으로 표현

  • 재귀 함수의 매개변수인 n이 0이 될때까지 3으로 나눠서 3진법 구하기

2. 3진법으로 표현된 숫자를 반전시키기

  • split('') : 문자열을 쪼개서 배열로 만들고
  • reverse( ) : 배열의 순서를 거꾸로 만든 뒤,
  • join(''): 배열 요소를 연결해 하나의 문자열로 만들기

3. 3진법 -> 10진법 숫자로 변환

  • Math.pow(밑, 지수) : 거듭제곱한 결과 반환
  • 거듭제곱 횟수 증가: 지수는 점점 커지고 있기 때문에 한 번 계산 후 digit++을 해준다.

🖥️ 코드

function solution(n) {
    let answer = 0, number = "", digit = 0;
    function DFS(n) {
        if (n === 0) return;
        else {
            DFS(parseInt(n / 3));
            number += String(n % 3);
        }
    }
    DFS(n);
    
    number.split('').reverse().join('');
    for (let i of number) {
        answer += (i * (Math.pow(3, digit)));
        digit++;
    }
    return answer;
}

Math.pow( )는 안 써봤는데 문제 풀면서 새롭게 알 수 있었다.
코드짤 때 사용한 나머지 함수들은 내 기준...자주 쓰는데도 계속 까먹고 헷갈리는 함수들이라
문제가 어렵진 않았지만 다시 상기시켜줘서 좋았던 것 같다..ㅠㅠ


❗ 다른 사람 풀이

(1) 풀이 1

function solution(n) {
    const answer = [];
    while(n !== 0) {
        answer.unshift(n % 3); // n % 3 값을 배열의 앞으로 추가하여 3진법을 만듦.
        n = Math.floor(n/3);
    }
    return answer.reduce((acc,v,i) => acc + (v * Math.pow(3, i)),0);   
}

진법 변환 시, 배열의 unshift( )를 활용하여 3진법으로 변환한 것과

나처럼 자리를 나타내는 digit 변수를 따로 만들지 않고도,
reduce함수를 써서 i를 활용한 계산이 인상적이다.


(1) 풀이 2

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

toString에 진법 변환,
parseInt에 특정 진수의 정수로 변환하는 기능이 있는 걸 처음 알았다..ㅇㅅㅇ

profile
안녕하세요!

0개의 댓글