코딩테스트

[코딩테스트 기본] 10진수를 2진수로 바꾸기 (Javascript)

보오 2022. 2. 20. 12:22

사실 자바스크립트에서는 Object.prototype.toString() 이라는 Web API로 진수 변환을 바로 할 수 있다.

toString의 인자로 radix(기수)을 넣으면 바로 변환을 해준다. (2~36까지만)

 

그래서 3을 2진수로 바꾸고 싶으면 아래와 같이 하면 된다.

let n = 3;
let res = n.toString(2);
console.log(res);

위 결과는 '11'이 될 것이다.

 

 

 

그러나 개발자라면 웹 API를 이용하지 않고 그냥 만들 수 있어야 한다.

 

 

코드로 구현하기 전에 수학(!!)으로 10진수를 2진수로 바꿔보자.

 

10진수로 된 정수 a를 2진수로 바꾼다고 하면 a를 2로 나눈 나머지와 몫을 다시 2로 나눈 나머지, 몫을 다시 2로 나눈 나머지,, 이렇게 몫을 더이상 2로 나눌 수 없을 때까지 2로 나누고 나머지를 기억해놨다가 이어붙이면 된다.

 

글로 하면 머리아프니까 흔히 하던 식으로 해보자.

 

10진수를 2진수로 바꾸는 식

 

일반 나눗셈 하듯이 나누되, 아래로 식이 이어지면서 옆에 나머지를 쓴다. 나머지는 1 또는 0. 더이상 나눌 수 없을 때(몫이 1이 될 때)까지 나누고 최종적으로 남은 몫과 나머지를 이어붙인다.

 

위 과정을 코드로 구현하면 여러가지 방법이 있을 수 있겠지만, 재귀함수를 사용해서 쉽게 구현할 수 있다.

 

 

재귀함수는 어떤 함수를 자기 자신을 호출하는 함수이다.

 

재귀함수 호출 시 if/else 구문을 사용하여 원하는 답에 다다를 때 까지 if문으로 조건을 걸어주고, 그렇지 않으면 끊임없이 자기 자신을 호출한다.

 

시나리오를 작성해보면, 우선 함수가 특정 숫자(2진수로 바꾸어야 할 값)를 인자로 받고, 해당 숫자를 계속 2로 나눈다.

언제까지 나누냐, 더이상 나눌 수 없을 때 까지인데, 몫이 1이거나 혹은 인자가 0이 될 때 까지이다.

1로 하면 조건을 1보다 작거나 같게 걸어야 하지만, 더 깔끔하고 알아보기 쉽게 짜려면 인자가 0이 될 때 까지로 하는게 좋다.

0이 되면 재귀함수를 그만두면 되니까.

 

조건에 걸리지 않으면(나눌 수 있으면) 2로 나눈 나머지를 인자로 넣는다. 2로 나눈 나머지를 코드로 구현하면 주어진 String을 파싱하여 정수를 리턴하는 parseInt을 쓰면 된다.

 

그리고 나머지를 특정 변수에 담아 기억해놨다가, 최종 리턴값이 될 전역변수에 +=로 이어붙이면 된다.

 

이 때, 변수에 할당하는 순서가 중요한데, 재귀함수로 먼저 나누고 난 뒤의 몫을 할당해야 한다. 재귀함수로 나누기 전에 할당해버리면 숫자의 순서가 바뀌게 된다.

 

 

최종적으로 구현한 코드는 아래과 같다.

 

function solution(n) {
  let answer = "";
  function DFS(L) {
    // inner 함수(내부 함수)
    if (L === 0) return;
    else {
      DFS(parseInt(L / 2, 10));
      const k = L % 2;
      answer += String(k);
    }
  }
  DFS(n);
  return answer;
}

 

테스트로 위에 직접 구했던 3, 5, 18을 대입해보면 11, 101, 10010으로 잘 나오는 것을 확인할 수 있다.