코딩/프로그래머스 코딩테스트

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

민쯔 2021. 11. 5. 15:05
728x90
반응형

안녕하세요. 민쯔입니다.😊
이번에는 3진법 뒤집기를 풀어봤습니다.
이 문제는 어려운 건 아닌데 검색하면 금방 풀 수 있어서 쉽게 풀 수 있었던 것 같아요.

그럼 해결 방안에 대해 설명하겠습니다.~ ㄱㄱ

function solution(n) {    
    return parseInt(n.toString(3).split('').reverse().join(''), 3);
}

이렇게 보니까 정말 간단해 보이지만, 이해가 안 될 수 있으니 이걸 풀어쓰면

function solution(n) {        
    // 10진법을 3진법으로
    let ternary = n.toString(3).split('');
    
    // 3진법을 역순으로
    let reverse = ternary.reverse().join('');
    
    // 역순 3진법을 10진법으로
    return parseInt(reverse, 3);
}

이렇게 됩니다.
그럼 하나하나 설명을 해보겠습니다.

 

10진법을 3진법으로

// 10진법을 3진법으로
let ternary = n.toString(3).split('');

MDN을 참고해서 설명하자면
toString()은 문자열을 반환하는 object의 대표적인 방법인데요.

여기서 toString()은
toString() : 특정한 Number 객체를 나타내는 문자열을 반환합니다.

 

numObj.toString([radix])

여기서 radix(기수)는 수의 값을 나타내기 위해 사용되기 위한 기준을 정하는 2와 36사이의 정수입니다.

  • 기수 = 진수를 나타내는 기수의 값.

만약 toString()에 2와 36의 사이 값이 아닌 radix가 주어지면, RangeError 에러가 발생합니다.
기수를 이용함으로써 10진수를 (1, 2, 3, 4, 5...) 다른 진수로 변환할 수 있습니다. 
아래는 10진수를 2진수로 변환하는 예제입니다.

위 예제 처럼 toString() 안에 2를 넣으면 2진수 3을 넣으면 3진수가 됩니다.

 

바꾼 3진법을 배열로

여기서 .split()를 넣는 것이 중요한데요.
split()를 쓰는 이유는 다음 단계인 3진법으로 바꾼 값을 역순으로 바꾸기 위해서는 reverse()를 써야 되는데
reverse()를 쓰기 위해서는 배열일 경우에만 쓸 수 있어서 split() 쓰는 겁니다.

  • split() : 메서드는 String 객체를 지정한 구분자를 이용하여 여러 개의 문자열로 나눕니다.
console.log(n.toString(3));
// 테스트 1 : 1200
// 테스트 2 : 11122

console.log(n.toString(3).split(''));
// 테스트 1 : ['1', '2', '0', '0']
// 테스트 2 : [ '1', '1', '1', '2', '2' ]

 

배열 3진법을 역순으로

// 3진법을 역순으로
let reverse = ternary.reverse().join('');

3진법을 역순으로 바꾸기 위해서는 reverse()가 필요한데요.

  • reverse() : 배열의 순서를 반전합니다. 첫 번째 요소는 마지막 요소가 되며 마지막 요소는 첫 번째 요소가 됩니다.
  • array.reverse()

 

배열 3진법을 문자열 3진법으로

이제 배열을 다시 문자열로 고쳐야 됩니다. 문자열로 고치기 위해 join()을 사용했습니다.

  • join() : 배열의 모든 요소를 연결해 하나의 문자열로 만듭니다.

console.log(ternary.reverse());
// 테스트 1 : [ '1', '2', '0', '0' ]
// 테스트 2 : 0021

console.log(ternary.reverse().join(''));
// 테스트 1 : [ '1', '1', '1', '2', '2' ]
// 테스트 2 : 22111

 

역순 3진법을 10진법으로

// 역순 3진법을 10진법으로
return parseInt(reverse, 3);

마지막으로 3진법을 다시 10진법으로 바꿔야 되는데 이때 parseInt()를 사용했습니다.

  • parseInt() : 문자열 인자를 구문 분석하여 특정 진수(수의 진법 체계에 기준이 되는 값)의 정수를 반환합니다.
  • parseInt(string, radix);
    • radix : 기수

 

위에 나온 설명을 다 합쳐 쓰면

return parseInt(n.toString(3).split('').reverse().join(''), 3);

빨간색 : 10진법을 3진법으로

노란색 : 3진법을 역순으로

파란색 : 3진법을 10진법으로

됩니다.

 

728x90
반응형