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;
}
}
문제를 풀자마자 머릿 속에 있는 생각 그대로를 글로 표현하다보니 설명이 매끄럽지 못한 것 같다.추후에 깔끔하고 간결하게 수정해보겠다..
'Algorithm > Programmers' 카테고리의 다른 글
[Programmers/Level 3/Java] 2 x n 타일링 (0) | 2020.06.19 |
---|---|
[Programmers/Level 2/Java] 조이스틱 (0) | 2020.06.10 |
[Programmers/Level 3/Java] 종이접기 (0) | 2020.06.06 |
[Programmers/Level 2/Java] 짝지어 제거하기 (0) | 2020.06.05 |
[Programmers/Level 2/Java] 최솟값 만들기 (0) | 2020.06.04 |