개발/자료구조 | 알고리즘 공부

[알고리즘 공부]자바스크립트 10진법에서 1~9의 다른 진법으로 바꾸기

prpn97 2023. 4. 30. 01:37

앞으로는 코딩테스트나 여러 루트로 알게 된 알고리즘에 대해 복습할 겸 따로 포스팅하려 한다. 

물론 toString(3)으로 바로 3진법으로 바꿀 수 있겠지만,

내장함수를 쓰지 않고 수학과 친해져보는 시간을 가져보자.

아직 10진법보다 큰 수로 변환하는 방법은 내게 너무 어렵기 때문에 그 부분은 아쉽게도

내가 더 똑똑해지면 포스팅해보겠다..

function decimalToBaseN(n, base) {
  let result = "";
  while (n > 0) {
    result = (n % base) + result;
    n = Math.floor(n / base);
  }
  return result || "0";
}

답은 이렇다. 

위에 언급한 것처럼 10진법에서 3진법으로 바꾼다고 가정해보자.

9를 3진법으로 바꾸면, 1,2,10,11,12,20,21,22,100 즉 100이 된다. 

간단하게는 3진법은 3이 되면 자릿수가 올라가기 때문에,

3*3*3, 10+10+10이 되면서 또 30을 쓸 수 없기 때문에 10, 20, 100으로 올라간다.

이건 얼렁뚱땅 간단하게 내가 설명한 것이고..

 

코드를 보면, n이 0보다 클 때, 즉 n이 0이 되면 반복문이 중단된다.

9 % 3 + result 의 값을 result에 하나씩 쌓는 것이다. 

그리고 쌓은 직후 9/3 의 소수점을 제외한 값을 다시 반복할 n의 값으로 사용한다.

 

계산해보면, 처음 result는 빈 문자열이고, 9%3 은 0이기 때문에

result는 빈 문자열에서 9%3의 값인 0이 문자열로 들어간다.

n은 9/3으로 3이 되겠다. 그러면 아직 n은 0보다 크기때문에 다시 반복문을 처음부터 돈다.

 

아직 빈 문자열인 result는 n%3을 하는데, 이번엔 n이 9가 아닌 아까의 값인 3인 것이다. 

3%3은 0이다. 그럼 '0'인 result에 0을 더해서 result는 '00'이다.

그리고 n은 3/3이므로 1이 된다. n은 여전히 0보다 크므로 다시 반복문을 돈다. 

 

'00'인 result는 1 % 3 + '00'의 값을 저장하게 된다. 1%3은 나눠지지 않으므로

자기 자신인 1이 나머지가 되며, '00'이였던 result에 1이 추가가 되면서 '100'이 된다.

 

그리고 result가 빈 문자열일 경우, ''는 곧 0이기 때문에 해당 값을 넣어 주었고,

result는 문자열로 반환되기 때문에 필요시 Number()로 타입을 바꿔주면 되겠다. 

728x90