항해 6일차 (알고리즘)

Undong·2023년 4월 8일
0

항해구구

목록 보기
6/52
post-thumbnail

항해 6일차 벌써 한 주 끝

오늘도 알고리즘을 풀었다. 오늘은 어렵다기 보단 뭔가 신기한 것이 있었다.

간략하게 보자면

이런 내용의 문제였다.

나는 이렇게 문제를 풀었다.

function solution(n) {
    let nBox = []
    while (true) {
        if(n / 3 >= 3){
            nBox.push(n % 3)  // >>> [0, 0]
            n = parseInt(n / 3) // >>> 몫
        } else if( n < 3){
            nBox.push(n)
            break
        } else {
            nBox.push(n % 3) // >>> [0, 0, 2]
            nBox.push(parseInt(n / 3)) // [0,0,2,1]
            break
        }
    }
    return nBox.reverse().reduce((prev, curv, idx)=> prev + 3**idx*curv , 0)
}

코드에 대해서 간략하게 설명 하자면,

숫자 n을 3진법으로 바꾸는 함수이다.
1. 먼저 빈 배열 nBox를 선언한다.
2. while문을 사용하여 주어진 숫자 n이 3보다 작을 때까지 3으로 계속해서 나눈다
3. 나머지를 nBox 배열에 push한다.
4. 만약 n이 3보다 작다면, 마지막 남은 나머지 n을 nBox 배열에 push하고 while문을 빠져나온다.
5.n이 3으로 나누어 떨어질 때, 마지막으로 nBox 배열에 나머지를 push하고 나눈 몫을 다시 n에 할당합니다.
6. nBox 배열을 뒤집고 reduce 함수를 사용하여 3의 제곱과 각 자리수를 곱하여 10진법으로 변환하여 반환합니다.

이런 식으로 풀었다.

나는 알고리즘 푼 뒤 다른 사람의 풀이를 보았다. 그 때 나는 경악할 수 밖에 없었다.
왜냐면

const solution = (n) => {
    return parseInt([...n.toString(3)].reverse().join(""), 3);
}

내가 푼 코드는 몇 줄에 거쳐서 풀었는데 이 코드는 한 줄에 끝나버려서 어이가 없었다.

알게 된점

다른 사람의 풀이를 보고 toString()함수가 진법으로 변환이 된다는 것을 알 수 있었다.

profile
console.log("Hello")

0개의 댓글