반응형
문제를 읽어보면 어떤숫자를 2~ n개로 나누엇을때 곱을 무한 반복하면서 가장 오랫동안 나눌 수 있는 경우는
최대 몇번인지 구하는 방법이다.
처음에는 BFS로 접근해서 Queue가 터지는 경우가 생긴다.
그경우는 num 이라는 숫자를 a*b = c 라고 한다면 어느 가지에서 c의 중복이 몇번 일어날 수있다.
따라서 각각의 가지를 hashMap으로 기억해놧다가 알고 있는 값이라면 빠르게 반환하는게 중요하다.
그리고 비트마스크를 이용해서 어떤숫자를 조각 할수있다.
숫자의 길이가 len =4 라고한다면
0000 // 아무것도 짜르지 않는경우 -> 이경우는 필요없으니 무시한다
0001 // 첫번째에 짜르는경우 ex 1234 를 1 234 로 나누는 경우다.
0101// 첫번째 3번째를 짜르는경우 1 23 4 로 나누는 경우다.
이렇게 생각한다면 몇개는 중복이 일어나지만 hashMap을 통해서 가지를 치기때문에 많은 시간복잡도가 나오지 않는다.
package 삼성;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Queue;
public class 숫자게임 {
static int T;
static long num;
static HashMap<Long, Integer> hash = new HashMap<Long, Integer>();
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
T = Integer.parseInt(br.readLine());
StringBuffer sb = new StringBuffer();
int turn;
for (int t = 1; t <= T; t++) {
num = Long.parseLong(br.readLine());
sb.append('#').append(t).append(' ');
// ------------------------------
turn = dfs(num);
// ------------------------------
sb.append(turn);
sb.append('\n');
}
System.out.println(sb.toString());
}
public static int dfs(long n) {
if (n < 10)
return 0;
if (hash.containsKey(n)) {
return hash.get(n);
}
String str = n + "";
int len = str.length();
int mvalue = 0;
for (int i = 1; i < (1 << len); i++) {
// 1인 순간에 컷 한다
long next = 1;
long th = 0;
for (int j = 0; j < len; j++) {
th = th * 10 + str.charAt(j) - '0';
if ((i & (1 << j)) > 0) {
// 컷
next *= th;
th = 0;
}
}
if (th != 0)
next *= th;
if(next!=n)
mvalue = Math.max(mvalue, dfs(next));
}
hash.put(n, mvalue+1);
return mvalue+1;
}
}
반응형
'ProgramSoliving' 카테고리의 다른 글
백준 : 10800 (0) | 2020.05.22 |
---|---|
백준 : 17090 미로 탈출하기 (0) | 2020.05.21 |
백준 : 13459 (0) | 2020.05.18 |
백준 : 3678 카탄의 개척자 (0) | 2020.05.17 |
백준 : 1091 (0) | 2020.05.17 |