문제
풀이
import java.util.*;
public class Solution {
static HashMap<Integer, Integer> map;
static boolean[] used;
static int[] arr;
public int solution(String numbers) {
arr = new int[numbers.length()];
used = new boolean[numbers.length()];
map = new HashMap<Integer, Integer>();
for (int i = 0; i < arr.length; i++)
arr[i] = numbers.charAt(i) - '0';
combination("");
System.out.println(map);
return map.size();
}
static void combination(String num) {
if (!num.equals("") || !num.isBlank()) {
int tmp = Integer.parseInt(num);
boolean flag = false;
if (tmp != 0 && tmp != 1) {
for (int i = 2; i < tmp - 1; i++) {
if (tmp % i == 0) {
flag = true;
break;
}
}
if (!flag)
map.put(tmp, map.getOrDefault(tmp, 0) + 1);
}
}
for (int i = 0; i < used.length; i++) {
if (!used[i]) {
used[i] = true;
combination(num + arr[i]);
used[i] = false;
}
}
}
}
문제점 해결
시간초과 나는 테스트 케이스가 있었는데 한 줄 추가로 이를 해결했다.
for (int i = 2; i < tmp - 1; i++) {
if (tmp % i == 0) {
flag = true;
}
}
기존의 코드인데 flag는 소수인지 아닌지를 판단하기 위한 boolean변수로 이미 소수가 아님을 확인했는데 break문이 없기 때문에 계속 반복 작업을 하게되고, 큰 숫자일때 시간초과가 발생한것이라 예상했다.
for (int i = 2; i < tmp - 1; i++) {
if (tmp % i == 0) {
flag = true;
break;
}
}
위처럼 break문 하나만 추가하니 바로 통과되었다.