ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스/JAVA] 소수 만들기
    Algorithm/Java 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;
        }
        
    }

     

    반응형
Designed by Tistory.