[백준/JAVA] 4948번 베르트랑 공준

정은아·2024년 2월 5일

[알고리즘] 수학 모음

목록 보기
26/152
post-thumbnail

내 풀이

import java.math.BigInteger;
import java.util.*;

public class Main {
    public static void main(String[] args) {

        // 자연수 n이 주어졌을 때, n보다 크고,
        // 2n보다 작거나 같은 소수의 개수를 구하는 문제

        // 값을 입력받기 전에, 범위까지의 배열을 만든다.
        // 에라토스테네스 체를 사용해서 for문을 돌린다.
        // 소수일 경우 arr[i] == 0 하고 그의 배수를 모두 1로 바꾼다.
        // 계속 반복하면서 소수인 숫자는 prime[i] == 1로 남긴다.
        // 그 후, while문을 돌려 테스트케이스를 입력받는다.
        // prime[i] == 1 인 경우에 answer++한다.
        // 출력한다.
        
        Scanner sc = new Scanner(System.in);
        StringBuilder sb = new StringBuilder();

        // 문제의 제한이 1 이상 123,456까지라서 2배해준다.
        int [] arr = new int[250000];
        int [] prime = new int [250000];
        int answer = 0;
        
        for (int i = 2; i < arr.length; i++) {
            if (arr[i] == 0){
                prime[i] = 1;
            }

            for (int j = i; j < arr.length ; j=j+i) {
                arr[j] = 1;
            }
        }

        while(true){
            int num = sc.nextInt();
            if (num == 0){
                break;
            }else{
                answer = 0;
                for (int i = num+1; i <= 2*num; i++) {
                    if (prime[i] == 1){
                        answer++;
                    }
                }
                sb.append(answer);
                sb.append("\n");
            }
        }

        System.out.println(sb.toString());
    }
}

느낀점

이 풀이는 우습게도.. 배열의 크기와 for문 안의 j의 범위를 제대로 설정하지 못해서 오래 걸린 풀이었다.
1. 배열의 크기 문제

  • n부터 2n까지 이므로 범위인 123,456*2 + 1 해줘야 했다.
  1. j의 범위 문제
  • for문 안의 j < arr.length로 해야하는데 j <= arr.length로 해서 배열범위 오류가 계속 났다. 신기한게 123457로 했을 땐.. 오류가 안나고 잘 돌아가서 캐치하기 되게 힘들었다.
profile
꾸준함의 가치를 믿는 개발자

0개의 댓글