Skip to content

[Java] 1644번 : 소수의 연속합 #51

@peppermintt0504

Description

@peppermintt0504

문제 풀이

해당 문제는 범위 내 존재하는 소수 구하기(에라토스테네스의 체)와 투 포인터 알고리즘이 합쳐진 문제이다.

주어진 숫자를 연속된 소수의 합으로 나타낼 수 있는 방법을 구하기 위해 우선 에라토스테네스의 체를 통해 해당 숫자 이하의 모든 소수를 먼저 구한다.

public static int[] getPrime(int num) {
		boolean[] visited = new boolean[num+1];
		visited[0] = true;
		visited[1] = true;
		
		for(int i = 2; Math.pow(i, 2) <= num; i++) {
			int c = 2;
			while(c * i <= num) {
				visited[c * i] = true;
				c++;
			}
		}

		ArrayList<Integer> nums = new ArrayList<>();
		
		for(int i = 0; i < visited.length;i++) {
			if(!visited[i]) {
				nums.add(i);
			}
		}
		int[] primes = new int[nums.size()];
		for(int i = 0; i < nums.size();i++)
			primes[i] = nums.get(i);
		return primes;
	}

이후 첫 소수에서 두 포인트로 시작해서 두 포인트 사이의 소수의 합을 숫자와 비교하여 숫자보다 클 경우 왼쪽 포인트를 오른쪽으로, 작을 경우는 오른쪽 포인트를 오른쪽으로 보내면서 소수의 합이 숫자와 같을 경우 answer에 추가해준다.

int left = 0;
int right = 0;

while(right < primes.length) {
    int sum = 0;
    for(int i = left; i <=right; i++) {
        sum+=primes[i];
    }
    if(sum > num) {
        left++;
    }else if(sum < num) {
        right++;
    }else {
        left++;
        answer++;
    }

풀이 코드

import java.util.*;
import java.io.*;


public class Main {
	public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	public static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
	public static StringTokenizer st;
	public static StringBuilder sb = new StringBuilder();
	public static int INF = 100_000_000;
	public static int[] dx = {0,1,0,-1};
	public static int[] dy = {-1,0,1,0};

	public static void main(String[] args) throws IOException{
		int num = Integer.parseInt(br.readLine());
		int[] primes = getPrime(num);
		
		int answer = 0;
		
		int left = 0;
		int right = 0;
		
		while(right < primes.length) {
			int sum = 0;
			for(int i = left; i <=right; i++) {
				sum+=primes[i];
			}
			if(sum > num) {
				left++;
			}else if(sum < num) {
				right++;
			}else {
				left++;
				answer++;
			}
		}
		System.out.println(answer);

	}
	public static int[] getPrime(int num) {
		boolean[] visited = new boolean[num+1];
		visited[0] = true;
		visited[1] = true;
		
		for(int i = 2; Math.pow(i, 2) <= num; i++) {
			int c = 2;
			while(c * i <= num) {
				visited[c * i] = true;
				c++;
			}
		}

		ArrayList<Integer> nums = new ArrayList<>();
		
		for(int i = 0; i < visited.length;i++) {
			if(!visited[i]) {
				nums.add(i);
			}
		}
		int[] primes = new int[nums.size()];
		for(int i = 0; i < nums.size();i++)
			primes[i] = nums.get(i);
		return primes;
	}
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions