어쩌다보니 발견..

원래는 나머지와 몫을 구한 다음 어떻게 저떻게 해볼 생각이었는데 다른 스터디팀에서 3의 제곱근을 범위로 해서 팀원에게 설명해주시는 걸 보고.. 몇제곱근인지를 먼저 확인하고 그다음에 제곱근을 낮춰서 가면 되지않을까? 라는 깜찍한 생각을 하게 되었다.
제일 큰 제곱근이 뭔지는 찾았으나 이 순간 알아차렸다.. 앞으로 더 복잡해질 거 같다라는 걸..
function solution(n){
let ternary = []
let i = 0
while (true) {
if (3**i<n && n<3**(i+1)){
ternary.push(i)
break
} else {
i++
}
}return ternary
}
그래서 나머지와 몫을 구해서 해결하는 방식을 사용하기로 했다.
이 코드가 만들어지기 전에는 n = parseInt(n/3)가 remainder = n%3보다 위에 위치 했었다. 이렇게 하면 n이 시작부터 n/3로 나뉘어진 상태에서 나머지를 계산하기 때문에 첫번째 n(즉, 처음 주어진 값)의 나머지는 뽑아내지 못하고 그 다음번 째부터 값을 뱉어내게 되는 문제점이 발생하게 되므로 순서를 바꿔주었다.
n=parseInt(n/3)은 직접 손으로 써봤을 때, 예를 들어 45라면, 45→15→5→1 이런 순서로 바뀌는 것에 착안하여 주어진 값 n을 그때그때 몫으로 대체해줘도 괜찮겠다는 생각을 하게 되었다.
마지막 위치의 if문은 몫을 다 구했을 때 반복문을 탈출하기위해서 넣게 되었다. n이 0이 되는 순간부터는 몫을 구하는 의미는 사라지는 것과 동시에 나머지들이 이미 다 나온 상태이므로 더이상 어떤 값을 구할 필요가 없어지게 된다.
따라서 2차 시도에서는 10진법을 3진법으로 돌리고 3진법을 역순정렬한 값을 출력할 수 있게 하였다.
function solution(n){
let i = 0
let groupOfremainder = [] // 나머지를 담을 곳
while (true) {
remainder = n%3 // 나머지를 계산
n = parseInt(n/3) // 주어진 n이라는 값에 나눴을 때의 몫을 계속해서 넣어주기.
groupOfremainder.push(remainder)
i++
if (n === 0){ //몫을 구하던 parseInt(n/3)에 의해서 0/3 1/3 2/3 등이 0을 출력하게 되면 사실상 더이상 몫을 구할 이유가 없어져서 반복문을 탈출.
break
}
}return groupOfremainder
}
// solution(45)
// 출력 [0, 0, 2, 1]
3진법을 10진법으로 어떻게 만드는지는 아는데 어떤 코드를 짜야할 지 막막했다.
그러다가 아래 그림 속 핑크빛의 제곱근을 보고는
(1)groupOfremainder의 길이 만큼 for문을 돌려서 제곱근은 순서대로 돌아가고
(2)groupOfremainder의 값은 하나씩 빼와서 계산해주고
(3)새로 만든 변수에 더하면 되겠다! 라는 생각을 하게 되었다.

function solution(n){
let i = 0
let groupOfremainder = [] // 나머지를 담을 곳
while (true) {
let remainder = n%3 // 나머지를 계산
n = parseInt(n/3) // 주어진 n이라는 값에 나눴을 때의 몫을 계속해서 넣어주기.
groupOfremainder.push(remainder)
i++
if (n === 0){ //몫을 구하던 parseInt(n/3)에 의해서 0/3 1/3 2/3 등이 0을 출력하게 되면 사실상 더이상 몫을 구할 이유가 없어져서 반복문을 탈출.
break
}
}//0021 3**3 / 3**2 /
let result = 0
for (let i=0; i<groupOfremainder.length; i++){ // i= 0,1,2,3
result += (3**(groupOfremainder.length-1-i))*groupOfremainder[i]
// console.log(result)
}
return result
}