소수 만들기
문제정의
nums에 있는 수 중 3가지를 뽑아 그 합이 소수인 경우의 수를 출력하는 문제이다.
문제풀이
전체 코드는 다음과 같다. 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
31package level2;
public class MakePrime {
//프로그래머스 문제풀이 level2 소수 만들기
public static void main(String[] args) {
int[] nums = {1,2,3,4};
int answer = ReturnPrimeCnt(nums, 0, 0, 3);
}
public static int ReturnPrimeCnt(int[] nums, int idx, int sum, int cnt)
{
if(cnt == 0)
{
for(int i = 2; i <= Math.sqrt(sum); i++)
{
if(sum % i == 0)
return 0;
}
return 1;
}
else
{
int res = 0;
for(int i = idx; i <= nums.length-cnt; i++)
{
res += ReturnPrimeCnt(nums, i+1, sum+nums[i], cnt-1);
}
return res;
}
}
}
이 함수는 3개만 아니라 4개, 5개로 영역을 뻗어나갈 수 있다. 하지만 속도가 좀 느릴 수 있다. 이 문제에선 오히려 3중 루프가 더 빠르다.
최종 시간복잡도는 3개 수를 뽑는 모든 수를 탐색하므로 \(O(n^3)\)이다.