Java/Java 알고리즘

백준 2581번 소수 JAVA 구현해보기

kimc 2022. 2. 4. 17:23

```

백준 2581번 소수 JAVA 구현해보기

```

이번 글을 통해 배워갈 내용

  1.  백준 2581번 풀이

https://www.acmicpc.net/problem/2581

 

2581번: 소수

M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다.  단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.

www.acmicpc.net

 

 

백준 2581번 소수는

난이도 실버 등급의 문제로서

 

10,000 이하의 두 수가 주어질 때

그 두수 포함 사이에 있는

가장 작은 소수와

소수의 합을 출력하고

없다면 -1을 출력하는 문제입니다.


30분 정도 위에 링크를 방문하셔서 풀어보시고

안 풀리시는 경우에만 아래 해답을 봐주시면 감사하겠습니다.


소수를 판별하는 배열을 만들고

그 배열을 활용해서

답을 찾습니다.

private static boolean[] findPrimeNumbers(int sqrtPrimeLimitNum) {
    int PrimeLimitNum = sqrtPrimeLimitNum * sqrtPrimeLimitNum;
    final boolean[] isPrime = new boolean[PrimeLimitNum];
    Arrays.fill(isPrime, Boolean.TRUE);
    isPrime[0] = false;
    isPrime[1] = false;
    for (int i = 2; i <= sqrtPrimeLimitNum; i++) {
        if (!isPrime[i]) continue;
        for (int j = i; j < PrimeLimitNum; j += i) {
            if (isPrime[j] && i != j) isPrime[j] = false;
        }
    }
    return isPrime;
}

 

전체 코드는 아래와 같습니다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {
    final static int SQRT_PRIME_LIMIT = 10000;

    public static void main(String[] args) throws IOException {
        final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        final boolean[] isPrime = findPrimeNumbers(SQRT_PRIME_LIMIT);

        int M = Integer.parseInt(br.readLine());
        int N = Integer.parseInt(br.readLine());

        List<Integer> primes = new ArrayList<>();

        for (int i = M; i <= N; i++) {
            if (isPrime[i]) {
                primes.add(i);
            }
        }

        if (primes.isEmpty()) {
            System.out.print(-1);
        } else {
            System.out.println(primes.stream().mapToInt(Integer::valueOf).sum());
            System.out.print(primes.get(0));
        }


        br.close();
    }

    private static boolean[] findPrimeNumbers(int sqrtPrimeLimitNum) {
        int PrimeLimitNum = sqrtPrimeLimitNum * sqrtPrimeLimitNum;
        final boolean[] isPrime = new boolean[PrimeLimitNum];
        Arrays.fill(isPrime, Boolean.TRUE);
        isPrime[0] = false;
        isPrime[1] = false;
        for (int i = 2; i <= sqrtPrimeLimitNum; i++) {
            if (!isPrime[i]) continue;
            for (int j = i; j < PrimeLimitNum; j += i) {
                if (isPrime[j] && i != j) isPrime[j] = false;
            }
        }
        return isPrime;
    }
}

 

 

읽어주셔서 감사합니다

 

무엇인가 얻어가셨기를 바라며

 

오늘도 즐거운 코딩 하시길 바랍니다 ~ :)

 


 

728x90