티스토리 뷰
출저 : https://programmers.co.kr/learn/courses/30/lessons/12899
"자리수와 시작 숫자를 구해서 그 지점에서부터 탐색"
구해야 하는 자리수와 시작 숫자를 알고 나서 그 지점부터 탐색하여 탐색 범위를 확 줄여서 시작한다.
startWith= 1 |
startWith= 2 |
startWith= 4 |
|
length = 1 | 1 (1) |
1 (2) |
1 (4) |
length = 2 | 3 (11,12,14) |
3 (21,22,24) |
3 (...) |
length = 3 | 9 (...) | 9 (...) | 9 (...) |
위와 같이 검색하면 내가 탐색해야 할 지점을 알 수 있다. 만약 여러 개의 테스트가 주어진다면 이 값을 배열로 저장하는 것도 좋을 듯 하지만 위 문제에서는 필요없어 매번 for문을 돌아서 아래 정보를 찾았다.
처음에 String return 하라고 하길래 바보같이 String 을 파라미터로 주어서 계속 String을 생성해 주었더니 시간초과 몇개가 나와 long으로 변경했다.
startWith 로 시작하는 length 자리 숫자들 중 k 번째 수.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | static int nth; static int length = 1; static int cnt; static boolean find; static String res; public static String solution(int n) { long[] map = {1,2,4}; int sum = 0; int w = 1; int start = 0; nth = 0; length = 1; find = false; res = ""; cnt = 0; loop : while(true) { for (int i = 0; i < 3; i++) { sum += w; if(sum >= n) { sum -= w; start = i; break loop; } } w *=3 ; length++; } nth = n-sum; solve(1,map[start]); return res; } static void solve(int len, long val) { if(find) return; if(length == len) { if(++cnt == nth) { find = true; res = String.valueOf(val); } return ; } solve(len+1,(val*10)+1); solve(len+1,(val*10)+2); solve(len+1,(val*10)+4); } | cs |
'Study > 알고리즘 문제풀이' 카테고리의 다른 글
백준 3019. 테트리스 :: 돼지개발자 (0) | 2019.01.28 |
---|---|
2018 카카오 1차 코딩테스트 오픈채팅방 :: 돼지개발자 (0) | 2019.01.23 |
2018 카카오 1차 코딩테스트 프렌즈4블록 :: 돼지개발자 (0) | 2019.01.23 |
2018 카카오 1차 코딩테스트 비밀지도 :: 돼지개발자 (0) | 2019.01.23 |
백준 14499. 주사위 굴리기 :: 돼지개발자 (0) | 2019.01.21 |
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday