[ 프로그래머스 | Lv.1 ] 3진법 뒤집기 (feat.진수 변환 방법 총정리)

angie·2022년 12월 9일
0
post-thumbnail
post-custom-banner

🎯 문제

문제 설명

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

제한사항

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

🧠 풀이 방법 1

직접 구현하는 방법!

1) 10진수 -> N진수

원리

10진수를 N으로 나눈 몫이 0이 될 때까지 계속 N으로 나눈다. N으로 나눌 때마다 그 나머지가 N진수의 자릿수가 된다. (작은 자릿수부터)

파이썬으로 구현한 코드

# n은 10진수, q는 N진수의 N (base)
def solution(n, q):
	rev_base = ''
    
    while n > 0:
    	# n을 q로 나눈 몫과 나머지
        n, r = divmod(n, q)
        rev_base += str(r)
    
    # 큰 자릿수가 뒤에 붙게되므로
    # 역순으로 뒤집어줘야 원하는 결과를 얻을 수 있다.
    return rev_base[::-1]

자바스크립트로 구현한 코드

function solution(n, q):
	let rev_base = '';
    
    while (n > 0) {
   		r = n % q;
      	n = parseInt(n / q);
      	rev_base += String(r);
    }
	// 자바스크립트에서는 문자열을 바로 뒤집을 수 없다.
	return rev_base.split('').reverse().join('');

2) N진수 -> 10진수

원리

N진수를 뒷자릿수부터 세며 각 자릿수의 숫자만큼 N의 제곱수를 곱하여 더한다.

자바스크립트 코드

// n은 N진수
function solution(n) {
  // n을 문자열로 변환 후 배열로 변환
  let arr = Array.from(String(n));
  
  let answer = 0;
  arr.forEach((val, idx) => (answer += 3 ** idx * val));
  return answer;
}

🧠 풀이 방법 2

자바스크립트의 내장 메서드를 활용하여 간단하게 N진법 변환이 가능하다!

1) 10진수 -> N진수

toString()사용

사용법

10진수.toString(N);  // N은 base

예시

let decimal = 1023;

decimal.toString(2); // 2진수로
decimal.toString(8); // 8진수로
decimal.toString(16); // 16진수로

2) N진수 -> 10진수

parseInt() 사용

사용법

parseInt(N진수, N);  // N은 base
  • 첫번째 인자로 문자열을 받는 것에 주의

예시

parseInt("1111", 2);  // 2진수에서 10진수
parseInt("1777", 8);  // 8진수에서 10진수
parseInt("3ff", 16);  // 16진수에서 10진수

3) N진수 -> N진수

N진수에서 10진수로 변환 후, 다시 N진수로 변환

예시

parseInt("1111", 2).toString(16); // 2진수에서 16진수로

🔠 내 풀이

풀이방법 1

function solution(n) {
  // 10 -> 3
  let three = ''
  while (n > 0) {
    r = n % 3
    n = parseInt(n / 3)
    three += String(r)
  }
  three = three.split('').reverse().join('')

  // 3 -> 10
  let arr = Array.from(three).map(Number)

  let answer = 0
  arr.forEach((val, idx) => (answer += 3 ** idx * val))
  return answer
}

풀이방법 2

function solution(n) {
  let answer = 0
  n.toString(3)
    .split('')
    .map(Number)
    .forEach((val, idx) => (answer += 3 ** idx * val))
  return answer
}
profile
better than more
post-custom-banner

0개의 댓글