ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 Lv.2) 124 나라의 숫자
    알고리즘/프로그래머스 2020. 5. 16. 17:30
    반응형

    124 나라의 숫자

     

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

    124 나라가 있습니다. 124 나라에서는 10진법이 아닌 다음과 같은 자신들만의 규칙으로 수를 표현합니다. 124 나라에는 자연수만 존재합니다. 124 나라에는 모든 수를 표현할 때 1, 2, 4만 사용합니다.

    programmers.co.kr

    풀이

    이 문제도 고민의 시간이 길었다. 문제 자체는 이해하기 쉬웠다. 모든 10진법 숫자는 1,2,4 세 개를 통해 표현해야하는 문제이고 3진법과 비슷한 느낌이라고 생각했다. 다만 다른 점?은 세가지 숫자만 이용하는데 1,2,3이 아닌 1,2,4라는 것이다.. ㅎㅎ

    조금 특이하게 이 문제는 로직 자체는 쉽게 떠올랐으나, 구현이 오래걸렸다.

    (멀쩡한 사각형과 이 문제는 어제 푼 문젠데, 어제 컨디션이 별로였나...??)

     

    1. 먼저 배열에 1,2,4를 순서대로 담아서, 입력받은 n 숫자에 대해 표현될 자릿수와 해당 자릿수의 시작 숫자를 구해 새로운 배열에 담아 반환했다.

    2. 자릿수와 해당 자릿수가 시작되는 숫자를 담은 배열과 target인 n을 받아와, 자릿수 만큼 char 배열을 만들어 주었다.

     2-1. 이 배열은 1에서 만들어 둔 1,2,4 배열의 inder를 표시할 숫자를 담았고 모두 0으로 초기화했다.

     2-2. target인 n에서 자릿수의 시작 값을 빼주어 차이를 저장했다..

     2-3. num가 0이 될때까지 while을 돌면서 마지막 인덱스부터 3으로 나눈 나머지 값을 더해주었다.

    3. 2에서 구한 값을 StringBuffer에 담아 toString 메소드를 통해 답을 반환해줬다.

     

    2-1에서 모두 0으로 초기화 한 이유 => 3진법을 벤치마킹해서 자릿수 만큼 111이 되게 해주었다.
    쉽게 표현하자면,
    자릿수 1 => 1     ~> 십진법  3
    자릿수 2 => 11    ~> 십진법 12
    자릿수 3 => 111  ~> 십진법 39
    num와 자릿수 시작의 차이만큼 3진법의 값을 올려주듯 올려준 것이다.

     

    글을 쓰다보니 2에서 char 배열을 만들어 주었는데, 반환값이 String이라 무의식적으로 그런것 같다... int 배열을 만들면 더 편했을텐데..

    코드 2에 적어놔야겠다.

     

    코드

    import java.util.Arrays;
    
    public class NumberOf124Nation {
        static final int[] numArr = {1,2,4};
    
        private static String solution(int n) {
            StringBuffer sb = new StringBuffer();
            int[] info = getDigit(n);   // 0 : digit, 1 : start Num
            char[] numChArr = getChArr(info, n);
    
            for(char ch : numChArr) {
                sb.append(numArr[ch-48]);
            }
            return sb.toString();
        }
    
        private static char[] getChArr(int[] info, int num) {
            char[] result = new char[info[0]];
            Arrays.fill(result, '0');
            num -= info[1];
            int idx = info[0]-1;
    
            while(num !=0) {
                result[idx--] += num%3;
                num /= 3;
            }
    
            return result;
        }
    
        private static int[] getDigit(int num) {
            int end = 0;
            int digit = 0;
            int start = 0;
    
            for(int i=1; i<19; i++) {
                end += Math.pow(3,i);
                start += Math.pow(3,i-1);
                digit = i;
                if(num <= end) {
                    break;
                }
            }
            int[] result = {digit, start};
      
            return result;
        }
        public static void main(String[] args) {
            int n = 39;
            System.out.println(solution(n));
        }
    }

    코드2

    import java.util.Arrays;
    
    public class NumberOf124Nation {
        static final int[] numArr = {1,2,4};
    
        private static String solution(int n) {
            StringBuffer sb = new StringBuffer();
            int[] info = getDigit(n);   // 0 : digit, 1 : start Num
            int[] numChArr = getChArr(info, n);
    
            for(int idx : numChArr) {
                sb.append(numArr[idx]);
            }
            return sb.toString();
        }
    
        private static int[] getChArr(int[] info, int num) {
            int[] result = new int[info[0]];
            Arrays.fill(result, 0);
            num -= info[1];
            int idx = info[0]-1;
    
            while(num !=0) {
                result[idx--] += num%3;
                num /= 3;
            }
    
            return result;
        }
    
        private static int[] getDigit(int num) {
            int end = 0;
            int digit = 0;
            int start = 0;
    
            for(int i=1; i<19; i++) {
                end += Math.pow(3,i);
                start += Math.pow(3,i-1);
                digit = i;
                if(num <= end) {
                    break;
                }
            }
            int[] result = {digit, start};
            
            return result;
        }
        
        public static void main(String[] args) {
            int n = 39;
            System.out.println(solution(n));
        }
    }
    반응형

    댓글

Designed by Tistory.