다희의 코딩 성장일기

[프로그래머스] level2. 124 나라의 숫자 (자바 JAVA) 본문

Algorithm/프로그래머스

[프로그래머스] level2. 124 나라의 숫자 (자바 JAVA)

ilmiodiario 2021. 8. 24. 18:30

[ 문제 ]  [프로그래머스] level2. 124 나라의 숫자 (자바 JAVA)

 

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/12899

 

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

 

programmers.co.kr


# 접근 방법 및 풀이 

 

  • 풀이를 생각해내는데 어려워서 인터넷 찾아봤다..휴!
  • 방법은 첫번째 방법두번째 방법이 있는데, 두번째 방법이 응용될 경우 더 좋을 것 같다.
  • 먼저 첫번째 풀이는 3진법과 1,2,4를 엮은 방법이다. 
  • 3진법은 0, 1, 2로 표현이되고, 124나라는 1,2,4로 표현된다. 여기서 나머지가 0이 나올경우 4로 표현해주고 몫에서 -1을 해주면 된다.
  • 그러나 이 방법은 1, 2, 4 나라일 경우만 표현 가능하다.
  • 만약에 1, 2, 4가 아니라 5, 6, 7 나라일 경우는 어떻게 표현할 수 있을까?
  • 10진수 숫자 567나라
    1 5
    2 6
    3 7
    4 55
    5 56
    6 57
  • 위와 같이 표현된다. 1~3까지는 5, 6, 7이라는 3가지 숫자로 표현되지만, 그보다 큰 수는 자릿수가 하나 더 늘어나 2자리가 된다. 따라서 4는 55부터 시작된다. 7부터는 첫째자리 수에서 자릿수 오름으로 65가 될 것이다.
  • 이때 끝의 자리가 계속해서 5, 6, 7, 5, 6, 7, 5, 6, 7, 5 ,6 ,7 이 반복되는 것을 알 수있다.
  • 여기서 두번째 방법은 먼저, 5,6,7숫자로만 이루어진 배열 arr[] = {5, 6, 7}을 생성해준다.
  • n (십진수) n-1 (n-1)%3 끝의자리 수
    1 0 0 arr[0] = 5
    2 1 1 arr[1] = 6
    3 2 2 arr[2] = 7
    4 3 0 arr[0] = 5
    5 4 1 arr[1] = 6
    6 5 2 arr[2] = 7
  • n -=1 즉, n에 -1을 한 후, %3을 하면 0, 1, 2 가 나올것이고, arr배열에서 해당 숫자 인덱스의 값을 뽑으면 된다.
  • arr[0] = 5 , arr[1] = 6, arr[2] = 7이 나온다.
  • 여기서 %3인 이유는 3개의 숫자로만 이루어져있기 때문이다. 
  • 그리고 n/3의 을 구해준다. 해당 몫이 0이면 break해서 빠져나온다. (여기서 n은 n-=1임)
  • 두번째 코드를 보면 더 이해하기 쉬울 것이다! 자세한건 코드참조해서 직접 숫자를 넣어서 과정을 그려가보면서 하면 이해가 쉽다.

# 주의할 점 

 

  • break 빠져나올 조건의 분기 위치 파악!

 

JAVA 코드

첫번째 풀이

class Solution {
    public String solution(int n) {
        StringBuilder sb = new StringBuilder();
        while(true){
            int quo = n / 3;
            int remain = (n % 3 == 0)? 4 : n % 3;
            sb.append(remain);
            n = (remain == 4)? quo-1: quo;
            if(n == 0)
                break;
        }
        return sb.reverse().toString();
    }
}

두번째 풀이

class Solution {
    public String solution(int n) {
        StringBuilder sb = new StringBuilder();
        int arr[] = {1,2,4};
        while(true){
            n -= 1;
            int quo = n / 3;
            int remain = n % 3;
            sb.append(arr[remain]);
            if(quo == 0)
                break;
            n = quo;
        }
        return sb.reverse().toString();
    }
}

 

 

REVIEW

Comments