본문 바로가기
Algorithm/Programmers

[Programmers] 124 나라의 숫자(JavaScript)

by 백승전 2022. 4. 7.

 

알림

 

본 포스팅은 공부 목적으로 작성된 글이며 상업적 목적으로 절대 사용되지 않았음을 밝힙니다.

 

문제

 

https://programmers.co.kr/learn/courses/30/lessons/12899

 

코딩테스트 연습 - 124 나라의 숫자

 

programmers.co.kr

 

124 나라가 있습니다. 124 나라에서는 10진법이 아닌 다음과 같은 자신들만의 규칙으로 수를 표현합니다.

1. 124 나라에는 자연수만 존재합니다.
2. 124 나라에는 모든 수를 표현할 때 1, 2, 4만 사용합니다.

예를 들어서 124 나라에서 사용하는 숫자는 다음과 같이 변환됩니다. 자연수 n이 매개변수로 주어질 때, n을 124 나라에서 사용하는 숫자로 바꾼 값을 return 하도록 solution 함수를 완성해 주세요.

 

10진법 124 10진법 124
1 1 6 14
2 2 7 21
3 4 8 22
4 11 9 24
5 12 10 41

 

풀이

 

124 나라는 1, 2, 4, 11, 12, 14, 21, 22, 24처럼 1, 2, 4가 계속 반복하며, 세 자리 숫자가 한 바퀴 돌면 즉, 세 번마다 십의 자리 숫자도, 그 이후엔 백의 자리 숫자도 계속 카운팅 됩니다.

 

그리고 문제에서 예시로 제공한 표를 보면, 받아오는 매개변수를 3으로 나눴을 때(3개의 숫자가 계속 해서 돌기 때문에) 나머지가 1이면 그대로 1, 2면 그대로 2, 0일 때는 4가 되는 것 또한 확인이 가능합니다.

 

따라서 숫자 1, 2, 4는 고정이기 때문에 1, 2, 4가 담긴 배열을 만들고,  나머지가 1이면 1, 2이면 2, 0이면 4이면 되게 코드를 작성해 줍니다.

 

그리고 3일 땐 04, 6일 땐 14, 9일 땐 24처럼, n이 3으로 나눴을 때 나머지가 0이면(3의 배수이면) 몫에서 1만큼 빠진 특징이 보이므로, 조건문을 통해 나머지가 0이면 3으로 나눠 1만큼 빼주고, 그 외엔 Math.floor() 함수를 통해 해당 숫자보다 같거나 작은 정수 중에서 가장 큰 숫자를 return 하면 될 것 같습니다.

 

코드

 

function solution(n) {
    let answer = '';
    let number = [4, 1, 2];
    
    while(n) {
        answer = number[n%3] + answer;
        n = n%3 === 0 ? n/3 -1 : Math.floor(n/3); 
    }
     
    return answer;
}

 

개발 중 의문 및 막혔던 부분에 대해 서술해 보겠습니다.

 

1. 왜 배열을 [1, 2, 4]가 아닌, [4, 1, 2]로 했을까?

 

이는 직접 배열을 [1, 2, 4]로 줘 트러블 슈팅을 함으로써 답을 찾을 수 있었는데요. 바로 배열의 index는 1, 2, 3, 4...가 아니라 0, 1, 2, 3...이기 때문입니다. 따라서 1, 2, 4로 가게 되면 number[1]은 1이 아닌 2인 등, 한 칸씩 밀리기 때문에 [4, 1, 2]가 맞습니다.

 

2. 왜 number[n%3]에서 answer을 한 번 더 더해줄까?

 

마지막에 answer를 안 해 줘도 출력되는 수는 똑같으나 변수 answer에 담아주기 위해 거치는 과정이었습니다.

 

 

노트

 

Math.floor(): 주어진 숫자보다 같거나 작은 정수 중에서 가장 큰 숫자를 반환합니다.

예시 1: Math.floor(2/3)이면 2/3(0.6666...)보다 같거나 작은 정수 중 가장 큰 숫자는 0

예시 2: Math.floor(17/3)이면 17/3(5.6666...)보다 같거나 작은 정수 중 가장 큰 숫자는 5

댓글