주어진 숫자 중 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
을 만들 수 있습니다.이 문제는 주어진 배열 속의 숫자 3개로 자신 또는 1로밖에 나누어지지 않는 소수를 만들 수 있는 경우의 수를 구하는 문제입니다.
저는 다음과 같은 방법으로 이 문제를 해결하였습니다.
true
일 경우 answer
을 1
증가시켜 소수가 될 수 있는 경우의 수를 구합니다.그럼 더 코드를 같이 보며 더 자세한 풀이를 남겨보도록 하겠습니다.
public int solution(int[] nums) {
int answer = 0;
nums
배열 속의 숫자 3개의 합이 소수인 경우의 수를 저장할 answer
을 0
으로 초기화하여 준비합니다.
for ( int i = 0; i < nums.length; i++) {
for ( int j = i+1; j < nums.length; j++) {
for ( int k = j+1; k < nums.length; k++) {
int sum = nums[i]+nums[j]+nums[k];
if ( isPrime(sum) ) {
answer++;
}
}
}
}
return answer;
다른 세 수의 합을 구하고, 만약 합이 소수라면 answer
을 1
증가시키는 부분입니다.
for문
을 세 개 준비함으로써 nums
안의 각각 다른 수들의 합을 구할 수 있도록 합니다.
sum
을 구한 뒤 메서드 isPrime()
의 리턴값이 true
라면 sum
이 소수라는 의미이므로 answer
을 1
증가시킵니다.
모든 경우의 수를 다 구하였다면 for문
을 빠져나온 뒤
public boolean isPrime(int num) {
boolean isPrime = true;
for ( int i = 2; i <= num/2; i++) {
if ( num % i == 0) {
isPrime = false;
break;
}
}
return isPrime;
}
이 문제의 핵심인 소수인지 판별하는 부분입니다.
메서드로 구현한 이유는 if문
으로 더 간결하게 표현하기 위해서는 리턴값이 있는 메서드를 따로 구현하는 것이 나을 것 같았고, 가독성을 더 좋게 하기 위함이었습니다.
소수인지를 판별할 변수인 isPrime
의 초깃값은 true
로 잡았고, 그 이유는 만약 num
이 i
로 나누어진다면 소수가 아니라는 것이므로 false
로 값을 변경하기 위함입니다.
그리고 쓸데없는 for문
의 낭비를 방지하기 위해서 소수가 아닌 것이 판별된다면 바로 break
를 걸어 for문
을 빠져나오게 하였고, num/2
까지만 for문
이 돌게 하였습니다.
여기서 주의할 점은 int i
의 초깃값을 2부터 시작해야 한다는 것입니다.
저는 무심코 i
의 초깃값을 1
부터 시작하게 되었는데 이 때는 실행 결과가 전부 0
으로 나왔습니다.
그 이유는 어떤 수던지 1
로는 나누어지기 때문에 isPrime
이 바로 false
로 바뀌게 된 것입니다.
소수는 1
과 자기자신으로만 나누어질 수 있는 수이기 때문에 1
을 제외한 2
부터 시작해야합니다.
명심해주세요!
class Solution {
public int solution(int[] nums) {
int answer = 0;
for ( int i = 0; i < nums.length; i++) {
for ( int j = i+1; j < nums.length; j++) {
for ( int k = j+1; k < nums.length; k++) {
int sum = nums[i]+nums[j]+nums[k];
if ( isPrime(sum) ) {
answer++;
}
}
}
}
return answer;
}
public boolean isPrime(int num) {
boolean isPrime = true;
for ( int i = 2; i <= num/2; i++) {
if ( num % i == 0) {
isPrime = false;
}
}
return isPrime;
}
}