📓 Study/Coding Test

[Algorithm Jobs] 소수 판별

seongit 2021. 11. 10. 15:15

package com.practice;

import java.util.Scanner;

public class Pre_10 {
    public static void main(String[]args){
        // 소수 판별
        // n / 1 = n
        // n / n = 1
        // 이렇게 두 경우만 소수이고, n / 2 = x ... 이렇게 나눠 떨어지는 경우는 소수가 아니다.

        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        // 1부터 n를 제외하고 반복문을 돌려서 n/i로 나눠 떨어지는 경우 N를 출력 == 소수가 아니다.
        String str = "";
        int cnt = 0;
        for(int i=2;i<=n;i++){
            // 소수가 아니다.
            if(n%i==0) {
                cnt++;
                str = "NO";
            }
            // 소수인 경우
            if(cnt==0){
                str="YES";
            }
        }
        System.out.println(str);
        // 출력은 한번만 되어야 한다 == 반복문 안에 들어가면 안된다.
    }
}

 

틀린 이유

90점이 나왔다.

1) "1"이 소수인지 아닌지 판단해야 하는데 그 구문이 빠짐

2) 위의 조건식으로는 모든 값이 n% i=0이 나오게 됨

예를 들어 n이 10이면 2,3,4,5,6,7,8,9,10까지 반복하게 되는데 10을 10으로 나누면 무조건 0이 되고 cnt++되며

STR="NO"가 된다.

 

 

수정한 코드

소수는 1과 자기 자신으로만 떨어지는 수! 따라서 n이 7이고 int i가 1일 때

7%1 == 0 -> cnt 증가

7%2 != 0

7%3!= 0

7%4!= 0

7%5!= 0

7%6!= 0

 

i의 값이 7일 경우는 조건식에 해당하지 않기 때문에 반복문을 빠져나온다.

이런 식으로 소수는 cnt가 1이 되는 숫자이며, 1이 아니라면 1과 자기 자신을 제외하여 다른 수로 나누어 떨어짐 (== 소수가 아님)이 되기 때문에 NO가 출력되는 것이다.

package com.practice;

import java.util.Scanner;

public class Pre_10 {
    public static void main(String[]args){
        // 소수 판별

        // n / 1 = n
        // n / n = 1
        // 이렇게 두 경우만 소수이고, n / 2 = x ... 이렇게 나눠 떨어지는 경우는 소수가 아니다.

        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        // 1부터 n를 제외하고 반복문을 돌려서 n/i로 나눠 떨어지는 경우 N를 출력 == 소수가 아니다.
        int cnt = 0;

        for(int i=1;i<n;i++){
            // 소수가 아니다.
            if(n%i==0) {
                cnt++;
            }
        }
        // 소수 = 약수 2개
        if(cnt==1) {
            System.out.println("YES");
        } else {
            System.out.println("NO");
        }
    }
}

 

배운 점

 

1) 문제 꼼꼼하게 파악하기

2) 조건식 그냥 숫자만 바꾸지 말고 손으로 직접 풀어보기!