3진법 뒤집기: toString()과 parseInt()로 한 방에 해결!

붕붕·2024년 12월 31일
post-thumbnail

오늘은 프로그래머스 월간 코드 챌린지 시즌1 문제인 3진법 뒤집기를 풀어보았다.

문제: 3진법 뒤집기

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

내가 생각한 해법

문제를 보자마자 떠오른 방법은 단순하게 10진수 -> 3진수 -> 10진수 순서대로 변환하는 것이었다.

  1. 10진수를 3진수로 변환: 나머지 연산(%)과 몫 연산(/)을 반복해서 구하기
  2. 3진수를 뒤집기: reverse()를 사용
  3. 3진수를 다시 10진수로 변환: 각 자리의 값을 계산하여 10진수로 변환

내가 짠 코드

function solution(n) {
    var answer = 0;
    let three = [];
  	// 3진수로 변환
    while (n >= 3) {
        three.push(n % 3); 
        n = parseInt(n / 3); 
    }
    three.push(n); // 마지막 남은 몫도 추가
    
  	// 10진수로 변환
    for (let i = 0; i < three.length; i++) {
        answer += three[i] * (3 ** (three.length - i - 1)); 
    }
    return answer;
}

과정 설명

  1. 10진수를 3진수로 변환
  • n이 3보다 작아질 때까지 n을 3으로 나눈 나머지를 배열(three)에 넣었다.
    이 과정에서 배열에는 역순으로 저장되었다.
  1. 뒤집기 생략
  • 원래는 배열을 reverse()로 뒤집으려 했으나 역순 저장돼서 생략하였다.
  1. 3진수를 10진수로 변환
  • 각 자리 숫자를 3 ** (자리의 위치)로 곱하고 모두 더해 10진수로 변환해주었다.

이렇게 단계별로 해결했다. 내가 짠 코드는 기본적인 원리를 직접 구현했지만 다른 사람의 풀이를 보니 훨씬 간단하게 작성한 걸 깨달았다.

모범 풀이(?)

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

이 코드는 내가 몰랐던 parseInttoString 의 기능을 활용한 간단한 풀이였다.

상세 설명

  1. toString()으로 10진수를 3진수 문자열로 변환
  • 괄호 안에 원하는 진수를 넣으면 해당 진수로 변환이 된다.
  1. 문자열 뒤집기
  • [...n.toString(3)]은 문자열을 배열로 변환
  • reverse()로 배열을 뒤집고 join("")으로 다시 문자열로 합친다.
  1. parseInt()로 10진수 변환
  • parseInt()의 두번째 매개변수에 진수를 넣으면 해당 진수 문자열을 10진수로 변환한다.

배운 점

toString()으로 숫자를 쉽게 진수 변환할 수 있다는 점
number.toString(radix)는 간단하게 원하는 진수로 변환할 수 있었다.

parseInt()로 문자열을 10진수로 변환할 수 있다!
parseInt(string, radix)를 활용하면 다양한 진수 변환 문제를 간단히 해결할 수 있을 것 같다.

profile
프론트엔드 개발자(가 되고 싶은 대학생)

0개의 댓글