[LV1]소수 만들기(JAVA)
https://programmers.co.kr/learn/courses/30/lessons/12977
코딩테스트 연습 - 소수 만들기
주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때
programmers.co.kr
문제 설명
주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.
제한사항- nums에 들어있는 숫자의 개수는 3개 이상 50개 이하입니다.
- nums의 각 원소는 1 이상 1,000 이하의 자연수이며, 중복된 숫자가 들어있지 않습니다.
입출력 예
num | 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을 만들 수 있습니다.
nums 배열이 주어지면 그중 3개를 골라서 다 더하고 그게 소수인지를 판별하면 되는 문제이다.
for문 3개를 써서 처음부터 순서대로
1 2 3
1 2 4
2 3 4
1 2 7
1 2 6
1 2 4
2 7 6
2 7 4
7 6 4
이런식으로 완탐해서 각각 값을 변수에 담아서 그게 소수이면 카운트를 증가시키면 된다.
소수는 1과 자기 자신으로만 나누어지는 숫자이다.
소스
class Soulution{
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) == true) {
answer++;
}
}
}
}
return answer;
}
private boolean isPrime(int n) {
for (int i = 2; i <= (int) Math.sqrt(n); i++) {
if (n % i == 0)
return false;
}
return true;
}
}
근데 여기서 소수를 판별하는 isPrime 에서
배열에서 3개를 골라서 더한값
예를들어 n=30 이라고 가정하면
30은
1*30
2*15
3*10
5*6
6*5
10*3
15*2
30*1
색깔이 변하는 기점으로 좌우 대칭인걸 알 수 있다.
그래서 sqrt 값보다 같거나 작은 값으로 나누어주면 그 이후에 대해서는 계산할 필요가 없다.
루트30 이면 5.xxx 값이고 5까지 나누었을때 나머지가 0이면 소수라고 볼 수 없는것이다.
그래서 i의 범위는 java의 내장함수를 사용해
i <= (int)Math.sqrt(n) 으로 지정해주면된다.