앞으로는 코딩테스트나 여러 루트로 알게 된 알고리즘에 대해 복습할 겸 따로 포스팅하려 한다.
물론 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()로 타입을 바꿔주면 되겠다.
'개발 > 자료구조 | 알고리즘 공부' 카테고리의 다른 글
[다이나믹 프로그래밍] LCS, LCSS 란? 그리면서 이해하기 - 1 (0) | 2023.05.05 |
---|---|
[완전탐색 문제풀이] 시각 (0) | 2023.05.04 |
[2018 E 기업 알고리즘 대회 | 그리디 문제풀이] 1이 될 때까지 (0) | 2023.05.03 |
[2019 국가 교육기관 코딩 테스트 | 그리디 문제풀이] 큰 수의 법칙 (0) | 2023.05.03 |
[알고리즘 공부] 배열 내 덧셈 근삿값 경우의 수 (0) | 2023.05.01 |