-
프로그래머스 Lv.2) 124 나라의 숫자알고리즘/프로그래머스 2020. 5. 16. 17:30반응형
124 나라의 숫자
풀이
이 문제도 고민의 시간이 길었다. 문제 자체는 이해하기 쉬웠다. 모든 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)); } }
반응형'알고리즘 > 프로그래머스' 카테고리의 다른 글
프로그래머스 Lv.2) 땅따먹기 (0) 2020.05.19 프로그래머스 Lv.2) 다음 큰 숫자 (0) 2020.05.19 프로그래머스 Lv.2) 멀쩡한 사각형 (0) 2020.05.16 프로그래머스 Lv.2) 스킬트리 (0) 2020.05.16 프로그래머스 Lv.4) 3xn 타일링 (1) 2020.05.14