Programming/Coding Test

프로그래머스 레벨2 - 124 나라 with Java

빠모스 2020. 4. 4. 14:52
반응형

문제 설명

 

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

124 나라에는 자연수만 존재합니다.
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

나의 코드

public class Programmers_124나라 {
    public String solution(int n){
        String answer = "";
        String[] numbers = {"4", "1", "2"};
        int rest = 0;

        while (n > 0){
            rest = n % 3;
            n /= 3;

            if (rest == 0) n--;

            answer = numbers[rest] + answer;
        }
        return answer;
    }

    public static void main(String[] args) {
        int n = 10;
        Programmers_124나라 test = new Programmers_124나라();
        System.out.println(test.solution(n));
    }
}

후기

처음 문제를 받았을 땐 도무지 이해가 가지 않았다. 1, 2, 4만 쓴다는건 3진법을 쓴다는건가 싶기도 했고... 4부터 십의자리수가 1이 되고 7부터 2가 되는걸 보니 몫과 나머지를 가지고 하는것 같았다. 그런데 문제는 10이 41이 되는 것이었다. 처음에는 n/3의 몫이 첫번째 자리로, 나머지가 두번째 자리로 할당되는것 같았다. 그런데 10의 경우 이 논리대로라면 31이 되야하는데 문제에선 41이라 나오는 것이었다... 이래 저래 코드를 짜봤지만 10은 계속 31로 나왔고, 또 위의 코드처럼 4, 1, 2를 문자 배열 형태로 주지 않고 나머지를 그냥 바로 Integer.toString을 써서 answer에 집어넣고 나머지가 0인경우 0대신 4를 집어넣는 것으로 코드를 짰더니 while문이 계속 돌아가면서 n에 어느 숫자를 넣던 답으로 한자리 수가 나왔었다. 위와 비슷한 구조이지만

 

if (rest == 0) {
    rest = 4;
    n-=1;
}

answer = Integer.toString(n) + Ingeter.toString(rest); 

이런 식이어서 몫과 나머지를 그대로 answer에 추가하는 것이었다. 이렇다보니 만약 n이 10이었다면 rest는 1, n은 3이되어 answer는 31이 되었다가, while문에 의하여 n이 아직 > 0이므로 3이었던 n이 다시 3으로 나뉘어져 1이 되고 rest는 0이 되었고, rest가 0이 되니 0대신 4가 대입되고 n은 -1이 되어 0이 되는, 즉 04가 answer로 출력되는 현상이 나타나게 되었다.

 

사실 rest = 4; n-=1; 이런식으로 문자배열을 쓰지 않고 바로 바꿔주는것은 큰 문제가 되지 않는다. 다만 내가 헷갈렸던건 몫을 추가하는 것이었다. 사실 몫은 answer에 아무 영향을 주지 않는다. answer에 몫과 나머지를 추가하는게 아니라 3으로 나눈 나머지를 계속 이어붙이는것이 핵심이었다. 즉, 10을 3으로 나눈 나머지 1을 맨 뒤에 먼저 붙이고, 10을 3으로 나눈 몫인 3을 반복문에 의해 다시 3으로 나누어 나머지가 0이되기 때문에 4를 그 앞에 붙이면 41이 된다. n은 이때 나머지가 0이기 때문에 n--;가 작동하여 0이 되고, 반복문 조건에 의해 반복이 종료된다. 그렇기때문에 answer = numbers[rest] + answer; 처럼, answer의 앞 인덱스로 나머지를 계속 추가하는 형식이 되어야 하는 것이다.

 

 

반응형