사실 자바스크립트에서는 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로 나누고 나머지를 기억해놨다가 이어붙이면 된다.
글로 하면 머리아프니까 흔히 하던 식으로 해보자.
일반 나눗셈 하듯이 나누되, 아래로 식이 이어지면서 옆에 나머지를 쓴다. 나머지는 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으로 잘 나오는 것을 확인할 수 있다.
'코딩테스트' 카테고리의 다른 글
[코딩테스트 기초] 회문문자열 판별(재귀함수, array splice을 이용하여 - javascript) (0) | 2022.02.20 |
---|---|
[코딩테스트] 2022 KAKAO BLIND RECRUITMENT 신고 결과 받기(Javascript) (0) | 2022.02.06 |
[프로그래머스 코딩테스트] 완전탐색 > 모의고사 (level 1) (0) | 2021.12.26 |
[코딩테스트] 2018 카카오 블라인드 테스트 - [1차]비밀지도 (Javascript) (0) | 2021.11.27 |
[코딩테스트] 2019 카카오 개발자 겨울 인턴십 - 크레인 인형뽑기(Javascript) (0) | 2021.11.22 |