프로그래머스 Lv.2) 124 나라의 숫자
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));
}
}