티스토리 뷰

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

문제 설명

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

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

예를 들어서 124 나라에서 사용하는 숫자는 다음과 같이 변환됩니다.

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

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

제한사항

  • n은 500,000,000이하의 자연수 입니다.

입출력 예

n result
1 1
2 2
3 4
4 11

나의 풀이 

-첫 번째 시도(실패) 

 

124나라의 규칙대로 숫자를 계속 써내려갔다. 3진법인건 알지만 혹시 뭔가 더 쉬운 방법이 있지는 않을까?? 하는 마음에 적어봤다.

1 1 11 42
2 2 12 44
3 4 13 111
4 11 14 112
5 12 15 114
6 14 16 121
7 21 17 122
8 22 18 124
9 24 19 141
10 41 20 142

 

계속 써보다가 발견한 규칙은 다음과 같다.

3N-2 ***1
3N-1 ***2
3N ***4

그러니까 어떤 수보다 크거나 같은 3의 배수를 구하고. 그 3의 배수를 124나라 표기법으로 표기한 다음에 일의 자리 수만 바꿔주면 된다.   

예를 들어, 4를 알고 싶다면. 4보다 크거나 같은 3의 배수인 6에 해당하는 124나라의 수에서 일의자리만 적당히 바꿔주면 된다. 

4 11
5 12
6 14

모든 3의 배수를 124나라 표기법으로 표시할 수만 있으면 나머지는 크거나 같은 3의 배수에서 일의 자리만 바꿔주면 된다고 생각해서. 3의 배수에 집중하기로 했다. 

 

3N의 124표기법을 알려면 N-1의 124표기법을 알아야 한다. 

3N='N-1의 124 표기법' + '4' 

3N N-1 N-1의 124 표기법 3N의 124 표기법 
3 0 없음  '4'
6 1 1 '1'+'4' = '14'
9 2 2 '2'+'4' = '24'
12 3 4 '4'+'4' = '44'
15 4 11 '11'+'4' = '114'
18 5 12 '12'+'4' = '124'
21 6 14 '14'+'4' = '144'
24 7 21 '21'+'4' = '214'
27 8 22 '22'+'4' = '224'
30 9 24 '24'+'4' = '244'
33 10 41 '41'+'4' = '414'
36 11 42 '42'+'4' = '424'
39 12 44 '44'+'4' = '444'

재귀를 통해서 계속 파고 들어가다보면 결국 답이 나오는 건데, 재귀? 마음에 안들지만 일단 시도해보기로 했는데 

계속 틀렸다. 이 방식으로 풀려고 한 2시간 코드 정도 계속 써봤는데 틀렸다.  내가 생각한 방법이 엉망인 것 같다.

 

-두 번째 시도

결국 지옥에서 빠져나와서, 3진법으로 바꿔서 풀어야겠다는 생각이 들었다.

 <script type="text/javascript">
    let n=30;
    let answer='';
    let country=[4,1,2]; 
    let temp=[]; 

    three(n);
    function three(n){
        if(n==0){ 
            make124();
        }
        else{ 
            let mock=Math.floor(n/3); 
            let nameozi=n%3; 
            temp.push(nameozi); 
            console.log("temp: "+temp)
            if(nameozi==0){ 
              mock--; 
            }
            return three(mock);
        } 
    }


    function make124(){ 
        temp=temp.reverse(); 
        for(let i=0; i<temp.length; i++){
            answer+=String(country[temp[i]]);
        }
    }


    
           console.log("answer "+ answer);

    </script>

temp에서 pop으로 꺼내려다가 몇 번 실패하고 그냥 reverse로 배열을 거꾸로 돌린 다음에야 간신히 성공했다. 

왜 다 만들어 놓고 pop을 못 쓸까? 

 

 

보통은 3진법처럼 하다가 나머지가 0이 될 때  몫에서 1을 빼고 넘겨주면 된다.

( 종이에 1부터 차례대로 3진법으로 만들어보면서 나머지가 0이 되는 상황에서 예외가 발생한다는 것을 알았고, 그 예외 상황과 기댓값을 비교해서 연결고리를 찾았다. )

   

풀고 나면 그래도 꽤 뿌듯한데. 다른 사람 풀이를 보면.. 


다른 사람 풀이

단 한 줄로 풀었다. 봐도 모르겠다^^ 


소감

처음에는 코딩테스트를 연습하려는 게 아니라 자바스크립트를 연습하려고, 자바스크립트를 더 잘 다루고 싶어서 코딩테스트에 접근했다. 모르는 내장 객체의 메서드를 배우려는 목적이었는데. 

 

 그런데. 겨우 2단계인데 원래 나의 목적보다 어떤 문제를 푸는 아이디어?에 더 집중을 하게 되는 것 같다. 다른 사람이 푼 거 보고 어지러워서 그냥 넘어가버리기도 하고;;

 

다른 사람 아이디어도 많이 보고, 좋다면 내 것으로 만드는. 그 과정이 중요한데 좀 귀찮다^^ 

 

그냥 1단계부터 풀면서 함수 정리나 해야겠다.   

 

 

 

 

 

 

 

728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함