본문 바로가기

Algorithm/Programmers

[Programmers/Level 2/Java] 124 나라의 숫자

Programmers(프로그래머스) 124 나라의 숫자

 

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

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

programmers.co.kr

문제 설명

124 나라에서는 다음과 같은 규칙으로 수를 표현한다.

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

즉, 다음과 같이 변환된 숫자를 사용한다.
1(10)  --->  1(124)
2(10)  --->  2(124)
3(10)  --->  4(124)
4(10)  --->  11(124)
5(10)  --->  12(124)
6(10)  --->  14(124)
7(10)  --->  21(124)
8(10)  --->  22(124)
9(10)  --->  24(124)
10(10)  --->  41(124)

자연수  n이 매개변수로 주어질 때, n을 124 나라에서 사용하는 숫자로 바꾸어 return 하라.

풀이

규칙을 잘 파악하면 쉽게 풀리는 문제이다.

10진수 숫자 중에서 3의 배수인 숫자들의 경우를 살펴보자.

10진수 124 나라 숫자
3 4
6 14
9 24

124 나라의 숫자로는 항상 4가 끝에 위치해 있다는 것을 알 수 있다.

이번에는 10진수 숫자들을 조금 풀어서 생각해보자.
1, 2, 4로 표현해야 하니, 10진수 숫자를 3으로 나눈 몫과 나머지에 대한 식으로 표현하였다.

10진수 124 나라 숫자 10진수 124 나라 숫자
1(=0*3+1) 1 6(=2*3+0) 14
2(=0*3+2) 2 7(=2*3+1) 21
3(=1*3+0) 4 8(=2*3+2) 22
4(=1*3+1) 11 9(=3*3+0) 24
5(=1*3+2) 12 10(=3*3+1) 41

10진수에서 나머지 부분과 124 나라의 숫자의 첫째 자리 수를 비교하면,
10진수에서 나머지가 1일 때 124 나라의 숫자에서는 1이, 나머지가 2일 때 2가, 나머지가 0일 때 4가 나타난다는 것을 알 수 있다. 

그렇다면 124 나라의 숫자에서 1, 2, 4를 1, 2, 0으로 바꾸어 표현해보자.

10진수 124 나라 숫자` 10진수 124 나라 숫자
1(=0*3+1) 1 6(=2*3+0) 10
2(=0*3+2) 2 7(=2*3+1) 21
3(=1*3+0) 0 8(=2*3+2) 22
4(=1*3+1) 11 9(=3*3+0) 20
5(=1*3+2) 12 10(=3*3+1) 01

수열이 어색해지긴 했지만, 10진수를 3으로 나누었을 때 나머지가 124 나라의 숫자 첫째 자리와 관련이 있음을 쉽게 알 수 있을 것이다.

이번엔 124 나라의 숫자 둘째 자리를 살펴보자.
이는 몫과 관련이 있다.
정확하게는 위의 표에서 표현한 몫이 아닌, 각 10진수 숫자에서 1을 빼고 3으로 나눈 몫과 연관이 있다.

10진수 124 나라 숫자 10진수 124 나라 숫자
1 -1 --> 0 (=0*3+0) 1 6 -1 --> 5 (=1*3+2) 10
2 -1 --> 1 (=0*3+1) 2 7 -1 --> 6 (=2*3+0) 21
3 -1 --> 2 (=0*3+2) 0 8 -1 --> 7 (=2*3+1) 22
4 -1 --> 3 (=1*3+0) 11 9 -1 --> 8 (=2*3+2) 20
5 -1 --> 4 (=1*3+1) 12 10 -1 --> 9 (=3*3+0) 01

둘째 자리는 10진수 숫자에서 1을 빼고 3을 나눈 몫에서 다시 3을 나눈 나머지를 표현한 것이라고 생각하면 된다.
=>  ((n-1) / 3) % 3

간결하게 정리하자면 다음과 같다.
첫째 자리 -> n % 3
둘째 자리 -> ((n-1)/3) % 3
셋째 자리 -> ((((n-1)/3)-1)/3) % 3

이러한 규칙을 가지고 구현한 코드는 다음과 같다.
거창한 설명에 비해 코드는 매우 간결하다.

class Solution {
    private int[] NUMBERS = {4, 1, 2};  # 0, 1, 2에 맞게 숫자를 입력하기 위해 미리 정의
    public String solution(int n) {
        String answer = "";

        while (n > 0)
        {
            answer = NUMBERS[(n%3)] + answer;
            n = (n-1)/3;
        }
        
        return answer;
    }
}

문제를 풀자마자 머릿 속에 있는 생각 그대로를 글로 표현하다보니 설명이 매끄럽지 못한 것 같다.
추후에 깔끔하고 간결하게 수정해보겠다..