📚 문제
✏️ 메모
3개씩 묶어 더해야 함. for 문을 3번 돌려서 더하는 방법으로 해보려 했음.
첫번째 시도.
for (int i = 0; i < nums.length; i ++ ) {
for (int j = 1; j < nums.length; j ++ ) {
for (int k = 2; k < nums.length; k++){
int sum = nums[i] + nums[j] + nums[k];
System.out.println((sum));
if (isPrime(sum)) {
answer ++;
}
}
}
}
결과가 중복되어 나타남 왜?
>>> 루프의 시작 인덱스가 0, 1, 2로 고정되어 있기 때문.
단순하게 0 1 2 부터 시작하면 되는 거 아니야? 라고 생각했으나...
i=1, j=2, k=3로 이미 2 + 3 + 4 조합이 나왔지만,
i=2, j=1, k=3에서 또 2 + 3 + 4 조합이 나옴.
반복문이 독립적으로 동작하여 중복된 조합이 발생.
배열의 인덱스가 서로 영향을 주도록 설정해서, 각 조합을 한 번만 만들 수 있도록 바꿔줌.
이전 값보다 큰 인덱스에서 시작하도록 각 루프의 범위를 조정.
🔎 문제해결
package codingTest.week3;
import java.util.Arrays;
public class MakePrime {
public static void main(String[] args) {
int[] nums = {1, 2, 3, 4};
System.out.println(solution(nums));
}
// 3개 를 골라서 더하는 것이니까..
// [1,2,3,4] 가 있을 때 1,2,3, 1,2,4 2,3,4 이렇게 더해야서 소수 인지 아닌지를 확인해야 하는 것임.
public static int solution(int[] nums) {
int answer = 0;
// 3개씩 배열을 더해야 함. 어떻게?
// 모든 경우의 수를 봐야하는 건 맞는데.
for (int i = 0; i < nums.length; i ++ ) {
for (int j = 1; j < nums.length; j ++ ) {
for (int k = 2; k < nums.length; k++){
int sum = nums[i] + nums[j] + nums[k];
System.out.println((sum));
if (isPrime(sum)) {
answer ++;
}
}
}
}
return answer;
}
// 소수 판별하는 메서드를 따로 빼서 true 이면 answer ++ 함.
private static boolean isPrime(int num){
boolean isPrime = true;
for (int j = 2; j <= Math.sqrt(num); j ++) {
// 딱 나누어지는 숫자가 있으면 소수가 아님.
if (num % j == 0 ) {
isPrime = false;
break;
}
}
return isPrime;
}
}
'Coding Test' 카테고리의 다른 글
[Coding Test] 프로그래머스 2단계 - 예상 대진표 (0) | 2024.12.04 |
---|---|
[Coding Test] 프로그래머스 2단계 - 구명보트 (0) | 2024.12.01 |
[Coding Test] 프로그래머스 1단계 - 모의고사 (0) | 2024.11.07 |
[Coding Test] 프로그래머스 2단계 - 피로도 (0) | 2024.11.03 |
[Coding Test] 프로그래머스 1단계 - 기사단원의 무기 (0) | 2024.10.31 |