본문 바로가기

Tech/Problem Solving

[백준 1644] 소수의 연속합 (Java)

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

 

1644번: 소수의 연속합

문제 하나 이상의 연속된 소수의 합으로 나타낼 수 있는 자연수들이 있다. 몇 가지 자연수의 예를 들어 보면 다음과 같다. 3 : 3 (한 가지) 41 : 2+3+5+7+11+13 = 11+13+17 = 41 (세 가지) 53 : 5+7+11+13+17 = 53 (두 가지) 하지만 연속된 소수의 합으로 나타낼 수 없는 자연수들도 있는데, 20이 그 예이다. 7+13을 계산하면 20이 되기는 하나 7과 13이 연속이 아니기에 적합한 표현이 아니다. 또한 한

www.acmicpc.net

 

접근 방법

주어진 값 보다 작거나 같은 소수를 모두 구해 리스트에 담았다.

 

그 후 for문을 이용해서 소수 리스트의 0번째 값부터 차례로 더하는데,

주어진 값 N보다 작거나 같을 때&&소수 리스트를 모두 방문할 때 까지 더한다.

 

만약 더하는 중에 더한 값이 N과 같아지면 count++를 하였다.

 

 

소스 코드

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    private static List<Integer> primeNumbers = new ArrayList<>();

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int N = scanner.nextInt();

        setPrimeNumbers(N);

        int count = 0;

	// 소수 리스트를 0번째부터 차례로 더해 값이 일치하는 경우를 확인
        for (int i = 0; i < primeNumbers.size(); i++) {
            int total = 0;
            int index = i;

            while (total <= N && index < primeNumbers.size()) {
                total += primeNumbers.get(index);
                index++;

                if (total == N) {
                    count++;
                    break;
                }
            }
        }

        System.out.println(count);
    }

	// 유클리드의 체 알고리즘을 이용해 소수를 구하는 메서드
    private static void setPrimeNumbers(int max) {
        boolean[] isNotPrime = new boolean[max + 1];

        isNotPrime[0] = true;
        isNotPrime[1] = true;

        for (int i = 2; i < isNotPrime.length; i++) {
            int next = i + i;

            if (!isNotPrime[i]) {
                while (next <= max) {
                    isNotPrime[next] = true;
                    next += i;
                }
            }
        }

        for (int i = 2; i < isNotPrime.length; i++) {
            if (!isNotPrime[i]) {
                primeNumbers.add(i);
            }
        }
    }
}
반응형