Coding Test

[Coding Test] 프로그래머스 1단계 - 소수 만들기

한비Skyla 2024. 11. 7. 21:41

📚 문제

✏️ 메모 

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;
    }

}