주어진 숫자 중 3
개의 수를 더했을 때 소수
가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums
가 매개변수로 주어질 때, nums
에 있는 숫자들 중 서로 다른 3
개를 골라 더했을 때 소수가 되는 경우의 개수를 return
하도록 solution
함수를 완성해주세요.
nums
에 들어있는 숫자의 개수는 3개 이상
50개 이하
입니다.
nums
의 각 원소는 1 이상 1,000 이하
의 자연수이며, 중복된 숫자가 들어있지 않습니다.
nums | result |
---|---|
[1,2,3,4] | 1 |
[1,2,7,6,4] | 4 |
입출력 예 #1
[1,2,4]
를 이용해서 7
을 만들 수 있습니다.
입출력 예 #2
[1,2,4]
를 이용해서 7
을 만들 수 있습니다.
[1,4,6]
을 이용해서 11
을 만들 수 있습니다.
[2,4,7]
을 이용해서 13
을 만들 수 있습니다.
[4,6,7]
을 이용해서 17
을 만들 수 있습니다.
class Solution {
public int solution(int[] nums) {
int answer = 0;
//주어진 수의 개수 확인
int cntOfNums = nums.length;
//첫째, 둘째, 셋째로 선택 된 수
int num1, num2, num3;
//첫째 수 선택하는 for
for ( int i = 0; i < cntOfNums; i++ ) {
num1 = nums[i];
//둘째 수 선택하는 for
for ( int j = i+1; j < cntOfNums; j++ ) {
num2 = nums[j];
//셋째 수 선택하는 for
for ( int k = j+1; k < cntOfNums; k++ ) {
num3 = nums[k];
//선택된 3개의 수를 더한다.
int sum = num1 + num2 + num3;
//소수인지 확인
if ( isPrime(sum)) {
answer++;
}
}
}
}
return answer;
}
//소수를 판별하는 메서드
public boolean isPrime(int n) {
boolean result = true;
for ( int i = 2; i <= n/2; i++ ) {
if ( n % i == 0) {
result = false;
break;
}
}
return result;
}
}
public int solution(int[] nums) {
solution
메서드에 nums
배열을 가져온다.
int answer = 0;
//주어진 수의 개수 확인
int cntOfNums = nums.length;
//첫째, 둘째, 셋째로 선택 된 수
int num1, num2, num3;
서로 다른 3개의 수를 골라 더했을 때 나오는 소수가 되는 경우의 수를 나타낼 answer
변수를 선언하고 0
으로 초기화한다.
외부에서 가져온 nums
에 주어진 수의 개수, 즉 nums
의 크기를 cntOfNums
에 저장한다.
//첫째 수 선택하는 for
for ( int i = 0; i < cntOfNums; i++ ) {
num1 = nums[i];
3개의 수 중 첫 번째 수를 선택하는 for문
이다.
주어진 수의 개수를 나타내는 cntOfNums
의 전까지 i
를 ++
시킨다.
여기서 i
는 nums
의 요솟값
이다.
nums
에 첫 번째로 들어있는 값을 num1
에 저장해야 하기 때문에 i
의 초깃값을 0
으로 잡아준다.
//둘째 수 선택하는 for
for ( int j = i+1; j < cntOfNums; j++ ) {
num2 = nums[j];
3개의 수 중 두 번째 수를 선택하는 for문
이다.
두 번째 수를 선택해야 하기 때문에 i
의 다음 수인 i+1
을 j
의 초깃값으로 지정한다.
j
또한 cntOfNums
이전까지 반복한다.
num2
에 nums
의 j
요솟값에 들어있는 값을 저장한다.
//셋째 수 선택하는 for
for ( int k = j+1; k < cntOfNums; k++ ) {
num3 = nums[k];
//선택된 3개의 수를 더한다.
int sum = num1 + num2 + num3;
//소수인지 확인
if ( isPrime(sum)) {
answer++;
}
}
3개의 수 중 세 번째 수를 선택하는 for문
이다.
세 번째 수를 선택해야 하기 때문에 i+1
을 나타내는 j
의 다음 수인 j+1
을 k
의 초깃값으로 지정한다.
k
또한 cntOfNums
이전까지 for문
을 반복한다.
num3
에 nums[k]
값을 저장한다.
이제 nums
안에 있던 3개의 수가 각각 num1
num2
num3
에 저장되었다. 이 세 변수들의 합을 구해 sum
에 저장한다.
문제가 sum
이 소수가 되는 경우의 수를 구하는 것이기 때문에 sum
이 소수인지를 확인하는 메서드인 isPrime()
을 만들고 sum
값을 준다.
만약 isPrime(sum)
의 리턴값이 true
라면 소수가 되는 경우의 수를 나타내는 answer
의 값을 1
증가시킨다.
//소수를 판별하는 메서드
public boolean isPrime(int n) {
boolean result = true;
for ( int i = 2; i <= n/2; i++ ) {
if ( n % i == 0) {
result = false;
break;
}
}
return result;
}
nums
의 세 값의 합인 sum
이 소수인지 아닌지를 판별하는 메서드이다.
소수인지 아닌지에 대한 결괏값을 저장할 result
의 초깃값을 true
로 지정한다.
solution함수
에서 가져온 sum
의 값은 n
에 저장된다.
i
는 n
을 나눌 용도로 쓰일 예정인데 i
의 값이 1
이라면 어느 값이든 나누어져 result
에는 항상 false
값이 저장되기 때문에 i
의 초깃값은 2
로 저장한다.
i
의 값이 n
이 될 때까지 나눌 필요 없이 n/2
까지 될 때까지만 나누어도 n/2
이상의 약수는 나오지 않기 때문에 실행 속도를 증가시키기 위해 i <= n/2
로 기술한다. 조건에 맞을 때까지 i
는 ++
을 수행한다.
만약 n
, 즉 세 수의 합계가 한 번이라도 i
로 나누어진다면 n
은 소수가 아니므로 result
에 false
값을 저장한 후 break
로 for문
을 빠져나와 result
값인 false
를 리턴한다.
i
가 n/2
가 될 때까지 n
이 i
로 나누어지지 않는다면 n
은 소수가 맞으므로 초깃값 그대로 result
를 true
로 리턴한다.
return answer;
nums
의 세 수의 합계가 소수가 되는 경우의 수를 리턴한다.
모든 for문
을 다 돌아 모든 경우의 수를 구한 뒤 answer++
된 값을 리턴한다.