주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.
👊🏻nums에 들어있는 숫자의 개수는 3개 이상 50개 이하입니다.
👊🏻nums의 각 원소는 1 이상 1,000 이하의 자연수이며, 중복된 숫자가 들어있지 않습니다.
class Solution {
public int solution(int[] nums) {
int answer = 0;
int sum = 0;
boolean flag = false; // true = 소수가 아님!!
for(int i = 0; i < nums.length - 2; i++){
for(int o = i + 1; o < nums.length - 1; o++){
for(int p = o + 1; p < nums.length; p++){
sum = nums[i] + nums[o] + nums[p];
flag = false;
for(int j = 2; j <= sum -1; j++) {
if(sum % j == 0) {
flag = true;
break;
}
}
if(flag == false) {
answer += 1;
}
}
}
}
// [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
System.out.println("Hello Java");
return answer;
}
}
일단 이 문제를 해결하려면 소수를 알아야 풀 수 있다.
소수란 1보다 큰 자연수 중 1과 자기 자신만을 약수로 가지는 수다.
예를 들어 nums={1,2,3,4}의 값을 가지고 있다고 생각해 보면 경우의 수는 1,2,3 / 1,2,4 / 1,3,4 / 2,3,4 중에 더해서 소수가 되는 수를 찾으면 되는 것이다.
length - 2를 한 이유는 i는 배열의 마지막 2개까지 돌릴 필요가 없는 것이다. i는 3게의 서로 다른 숫자들 중에 맨 앞에 오는 숫자이다. 즉 예시에서 보면 i= 1,2가 될 수 있다.
o = i + 1; o < nums.length - 1;를 한 이유도 첫 번째 for 문이랑 별다를 게 없다 o는 2,3이 둘 중 하나의 값이 나와야 하기 때문이다.
sum이라는 변수에 i + o + p를 해 주고 flag를 초기화해 둔다.
sum의 값이 소수인지 아닌지를 판단해 준다.
소수는 1과 자기 자신만을 약수로 가지기 때문에 2부터 시작해서 sum -1을 한 값을 계속 계산해 본다.
sum % j == 0이라면 소수가 아니기 때문에 flag를 true로 만들어 주고 braek를 걸어 4번째 for 문을 빠져나간다. 만약 sum % j != 0이라면 마지막 if 문을 타서 answer의 값을 1씩 증가시켜준다.