Algorithm/Java

[프로그래머스/JAVA] 소수 만들기

dbfl9911 2025. 2. 6. 09:37
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/12977

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


 

[ 오답 노트 ]

❌ 기존 오답 코드

class Solution {
    public boolean isDemic(int num) {
        // 소수 판별
        for(int i = 2; i <= (int)Math.sqrt(num); i++) {
            if(num % i == 0) {
                return false;
            }
        }
        return true;
    }
    
    public int solution(int[] nums) {
        // 입출력 예 #1 [1,2,3,4]
        // [1,2,3] -> 1 + 2 + 3 = 6 (소수 x)
        // [인덱스0, 인덱스 1, 인덱스2]
        // [1,2,4] -> 1 + 2 + 4 = 7 (소수 O)
        // [인덱스0, 인덱스 1, 인덱스3]
        // [1,3,4] -> 1 + 3 + 4 = 8 (소수 x)
        // [인덱스0, 인덱스 2, 인덱스3]
        // [2,3,4] -> 2 + 3 + 4 = 9 (소수 x)
        // [인덱스1, 인덱스 2, 인덱스3] 
        int answer = 0;
        
        for(int i = 0; i < nums.length; i++) {
            int sum = 0;
            for(int j = i; j < nums.length; j++) {
                for(int x = j; x < nums.length; x++) {
                    sum += (nums[i] + nums[j] + nums[x]);
                }
                 // 소수 판별
                if(isDemic(sum)) {
                    answer++;
                }
            }
        }
        
        return answer;
    }
    
}

 

 

📌 기존 코드의 문제점 및 해결 방안

 

1. 내부 for문 루프 오류 해결 

  • 내부 for문 루프에서 j = i, x = j로 설정하여 중복된 숫자를 선택할 가능성이 있어, 조합을 만들 때 다른 숫자 세개를 선택해야 하지만 같은 숫자가 포함될 수 있음.
  • j = i+1, x = j+1로 설정하여 서로 다른 숫자 3개를 선택하도록 해결하고, 각각 for문 루프의 범위도 정확하게 수정한다. 

2. 합계(sum) 계산 위치 오류 해결

  • sum을 한 번 선언하고 반복문 안에서 누적하는 방식이므로 잘못된 값이 나올 수 있음
  • sum을 내부 루프에서 초기화하여 올바른 조합의 합을 구하도록 해 해결

 

        // 첫번째 숫자 탐색
        for(int i = 0; i < nums.length - 2; i++) { // 마지막 두개의 숫자 남아있어야함.
            // 두번째 숫자 탐색
            for(int j = i+1; j < nums.length - 1; j++) { // 마지막 한개의 숫자 남아있어야함.
                // 세번째 숫자 탐색
                for(int x = j+1; x < nums.length; x++) {
                    int sum = nums[i] + nums[j] + nums[x];
                     // 소수 판별
                    if(isDemic(sum)) {
                        answer++;
                    }
                }
                
            }
        }

 

📌 정답 코드

class Solution {
    public boolean isDemic(int num) {
        // 소수 판별
        for(int i = 2; i <= Math.sqrt(num); i++) {
            if(num % i == 0) {
                return false;
            }
        }
        return true;
    }
    
    public int solution(int[] nums) {
        // 입출력 예 #1 [1,2,3,4]
        // [1,2,3] -> 1 + 2 + 3 = 6 (소수 x)
        // [인덱스0, 인덱스 1, 인덱스2]
        // [1,2,4] -> 1 + 2 + 4 = 7 (소수 O)
        // [인덱스0, 인덱스 1, 인덱스3]
        // [1,3,4] -> 1 + 3 + 4 = 8 (소수 x)
        // [인덱스0, 인덱스 2, 인덱스3]
        // [2,3,4] -> 2 + 3 + 4 = 9 (소수 x)
        // [인덱스1, 인덱스 2, 인덱스3] 
        int answer = 0;
        
        // 첫번째 숫자 탐색
        for(int i = 0; i < nums.length - 2; i++) { // 마지막 두개의 숫자 남아있어야함.
            // 두번째 숫자 탐색
            for(int j = i+1; j < nums.length - 1; j++) { // 마지막 한개의 숫자 남아있어야함.
                // 세번째 숫자 탐색
                for(int x = j+1; x < nums.length; x++) {
                    int sum = nums[i] + nums[j] + nums[x];
                     // 소수 판별
                    if(isDemic(sum)) {
                        answer++;
                    }
                }
                
            }
        }
        
        return answer;
    }
    
}

 

반응형