문제이름 :
소수 만들기
문제 설명 :
주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다.
숫자들이 들어있는 배열 nums가 매개변수로 주어질 때,
nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때
소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해 주세요.
처음에 생각을 했을 땐 배열의 값을 랜덤으로 받아서 하면 되려나?라고 생각을 해서
배열의 값 중에서 랜덤으로 하나를 반환하게끔
코드를 작성을 했었는데 Math.random을 사용해서 하니 중복된 값도 나오고
모든 경우의 수를 못 구하게 되어서
다른 방법을 생각했다.
nums 배열에 있는 숫자 중 3개를 더해야 하니 (num [] = {1,2,3,4} 일 때를 가정)
반복문을 3중으로 써서 1번은 0, 1번째를 나오게 2번은 1,2 째를 나오게 3번은 2,3 이 나오게 만들어서
뒤에서부터 1씩 증가시켜가면서 차례로 sum에다가 더한다
isPrime이라는 boolean을 리턴하는 메서드를 만들어서 sum이 소수이면 true를 소수가 아니면 false를 리턴한다.
if문 안에 for을 써서 소수인지 아닌지를 쓸려고 했는데 코드를 쓰다가 헷갈릴 것 같아서 따로 메서드를 만들었다.
따로 써주면 코드를 보기도 편하고 이해하기 쉽다.
isPrime을 살펴보면
정수를 받아야 하니 int num을 매개변수로 지정해 줘서 num이 1 이하이면 소수가 아니기 때문에 false를 리턴한다.
반복문을 통해서 2부터 num의 제곱근까지 반복을 해주고 num % i == 0 이면 소수가 아니기 때문에 이것도 false를 리턴
(num = 6 일 경우 6 제곱근은 2.?? 이기 때문에 6 % 2를 하게 되면 나머지가 0이 돼서 소수(1과 자기 자신만)가 아니다)
저 2개다 아니면 소수이기 때문에 true를 리턴한다
if문에서 isPrime(sum)이 true면 count를 1 증가시킨다.
public class Solution {
public int solution(int[] nums) {
int count = 0;
// nums 배열에서 세 숫자의 모든 조합을 찾습니다.
for (int i = 0; i < nums.length - 2; i++) {
for (int j = i + 1; j < nums.length - 1; j++) {
for (int k = j + 1; k < nums.length; k++) {
int sum = nums[i] + nums[j] + nums[k];
if (isPrime(sum)) {
count++;
}
}
}
}
return count;
}
// 소수 판별 함수
boolean isPrime(int num) {
if (num <= 1) return false;
for (int i = 2; i <= Math.sqrt(num); i++) {
if (num % i == 0) return false;
}
return true;
}
}
'프로그래머스 문제' 카테고리의 다른 글
프로그래머스 Java 로또의 최고 순위와 최저 순위 (0) | 2024.07.26 |
---|---|
프로그래머스 Java 기사단원의 무기 (0) | 2024.07.25 |
프로그래머스 JAVA (모의고사) (3) | 2024.07.22 |
[프로그래머스] (Java) 2016년 (0) | 2024.07.19 |
프로그래머스 Java (푸드 파이트 대회) (0) | 2024.07.18 |