[JAVA][정올 1901] 소수 구하기

SHORTCUT

    반응형
    사이트명 정올
    문제 링크 jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=1174&sca=2040
    주요 알고리즘 #수학
    사용 언어 Java 자바
    설명이 장황합니다.. 도움되는 것만 파악하세요 :-)

    1. 문제

    2. 입력 / 출력

     

     


    3. 풀이

    3-1. 생각 노트

    일단 하나씩 줄어드는 거 먼저 확인.

    그 때의 카운트를 체크하여, 올라가는 거를 다시 확인.

    두 경우의 카운트를 비교하여 출력값 결정.

     

    3-2. 변수명

    type 변수명 설명
    int cnt 내려가면서 체크할 때의 카운트
      cnt2 올라가면서 체크할 때의 카운트

     

    3-3. 코드 보기

    /**************************************************************
        Problem: 1901
        Language: Java
        Result: Success
        Time:789 ms
        Memory:20096 kb
    ****************************************************************/
     
     
    import java.util.Arrays;
    import java.util.Scanner;
     
    public class Main {
     
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
     
            int N = sc.nextInt(); // 처리해야 할 수의 개수 (100 이하 정수)
     
            int[] answer = new int[2];
     
            for (int tc = 0; tc < N; tc++) {
                 
                int num = sc.nextInt();
     
                // 자신부터 내려가며 체크
                int cnt = 0;
    here1: for (int g = num; g > 1; g--) {
                    cnt++;
     
                    // 소수 판별 -> 통과? 정답
                    for (int p = 2; p < g; p++) {
                        if (g % p == 0) {
                            continue here1;
                        }
                    }
     
                    answer[0] = g;
                    break;
                }
     
                // 소수가 없을 경우, cnt 를 최대값으로 설정하여 오름체크 아웃을 거름
                if (answer[0] == 0) {
                    cnt = Integer.MAX_VALUE;
                }
     
                //자신부터 올라가며 체크
                int cnt2 = 0;
    here2: for (int k = num; num <= 1000000; k++) {
                    cnt2++;
                     
                    // 앞서 찾은 카운트보다 더 커진 경우 -> 작은 쪽의 소수를 출력
                    if (cnt2 > cnt) {
                        System.out.println(answer[0]);
                        break;
                    }
     
                    // 소수 판별 -> 통과? 정답
                    for (int p = 2; p < k; p++) {
                        if (k % p == 0) {
                            continue here2;
                        }
                    }
                     
                    answer[1] = k;
     
                    // 같은 카운트 일 경우
                    if (cnt2 == cnt) {
                        if(answer[0] == answer[1]){     // 답이 같으면, 하나만 (num 자체가 소수)
                            System.out.println(answer[0]);
                        }else {                         // 정답 정렬해서 출력
                            Arrays.sort(answer);
                            System.out.println(answer[0] + " " + answer[1]);
                        }
                         
                    // 그 외 경우, 오름체크에서 찾은 소수가 정답
                    }else {
                        System.out.println(answer[1]);
                    }
                    break;
                }
            }
     
        }
     
    }

     

    3-4. 마무리

    되게 간단한 문제인데, 의외로 예외 상황에 대한 생각이 잘 안섰다..

    정올이 어떤 테케에서 틀렸는지를 알려줘서 망정이지, 안그랬으면 헤맸을것같다..

    멀었다 멀었어.

     

    다음번엔 소수 판별하는 메소드를 만들어서 코드 가독성 좀 높여야겠다.

     

     

     

     

    반응형

    댓글

    Designed by JB FACTORY