Hayden's Archive

[알고리즘] 백준 - 1978번 : 소수 찾기 / 1929번 : 소수 구하기 / 6588번 : 골드바흐의 추측 / 17103번 : 골든바흐 파티션 본문

Algorithm

[알고리즘] 백준 - 1978번 : 소수 찾기 / 1929번 : 소수 구하기 / 6588번 : 골드바흐의 추측 / 17103번 : 골든바흐 파티션

_hayden 2020. 7. 11. 23:14

알고리즘 문제 출처 : https://www.acmicpc.net/problem/1978

 

1978번: 소수 찾기

첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.

www.acmicpc.net

 

내가 작성한 코드

import java.util.Scanner;

public class Main {
	
	public static boolean prime(int a) {
		if(a==1) {//1인 경우
			return false;
		}
		for(int i=2; i*i<=a; i++) {
			if(a % i == 0) {//약수인 경우
				return false;
			}
		}
		return true;//소수인 경우
	}
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int answer = 0;
		for(int i=0; i<n; i++) {
			int num = sc.nextInt();
			if(prime(num)==true) {
				answer++;
			}
		}
		System.out.println(answer);
	}
}

 

 


알고리즘 문제 출처 : https://www.acmicpc.net/problem/1929

 

1929번: 소수 구하기

첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.

www.acmicpc.net

 

내가 작성한 코드

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Scanner;

public class Main {
	
	public static void main(String[] args) throws IOException {
		Scanner sc = new Scanner(System.in);
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringBuilder sb = new StringBuilder();
		int m = sc.nextInt();
		int n = sc.nextInt();
		boolean[] checked = new boolean[n+1]; //소수가 아닌 경우 true
		int[] answer = new int[n-m+1]; //소수를 저장
		int index = 0; //정답을 저장할 인덱스
		for(int i=2; i<=n; i++) {
			if(checked[i]==false) {//소수일 경우
				if(m<=i) {//m보다 같거나 큰 소수부터 저장
					answer[index++] = i;
				}
				for(int j=i*2; j<=n; j+=i) {//소수의 배수들을 체크
					checked[j]=true;
				}
			}
		}
		for(int i=0; i<answer.length; i++) {
			if(answer[i]==0) {
				break;
			}
			sb.append(answer[i]+"\n");
		}
		bw.write(sb.toString());
		bw.flush();
		bw.close();
		sc.close();
	}
}

 

 


알고리즘 문제 출처 : https://www.acmicpc.net/problem/6588

 

6588번: 골드바흐의 추측

문제 1742년, 독일의 아마추어 수학가 크리스티안 골드바흐는 레온하르트 오일러에게 다음과 같은 추측을 제안하는 편지를 보냈다. 4보다 큰 모든 짝수는 두 홀수 소수의 합으로 나타낼 수 있다.

www.acmicpc.net

 

내가 작성한 코드

import java.util.Scanner;

public class Main {
	
	public static boolean[] prime(int n) {
    	//에라토스테네스의 체로 소수가 아닌 것 true 표기
		boolean[] check = new boolean[n+1];
		check[0]=check[1]=true;
		for(int i=2; i<=n; i++) {
			if(check[i]==false) {
				for(int j=i*2; j<=n; j+=i) {
					check[j]=true;
				}
			}
		}
		return check;
	}
	
	public static void main(String[] args) {
		boolean[] check = prime(1000000);
		Scanner sc = new Scanner(System.in);
		int n = 0;
		while((n=sc.nextInt())!=0){
			int b = 0;
			String answer = "";
			for(int i=3; i<=n-3; i+=2) {
				/* b-a가 가장 큰 것을 출력해야 하므로
				b가 가장 큰 것을 출력(a는 가장 작은 홀수 소수인 3부터 출발) */
				b = n-i; 
				if(check[i]==false && check[b]==false) {
					answer = n+" = "+i+" + "+b;
					break;
				}
			}
			System.out.println(answer);
		}
	}
}

 

 


알고리즘 문제 출처 : https://www.acmicpc.net/problem/17103

 

17103번: 골드바흐 파티션

첫째 줄에 테스트 케이스의 개수 T (1 ≤ T ≤ 100)가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 N은 짝수이고, 2 < N ≤ 1,000,000을 만족한다.

www.acmicpc.net

 

내가 작성한 코드

import java.util.Scanner;

public class Main {
	public static boolean[] prime(int n) {
		boolean[] check = new boolean[n+1];
		check[0] = check[1] = true;
		for(int i=2; i<=n; i++) {
			if(check[i]==false) {
				for(int j=i*2; j<=n; j+=i) {
					check[j] = true;
				}
			}
		}
		return check;
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		boolean[] check = prime(1000000);
		for(int i=0; i<n; i++) {
			int even = sc.nextInt();
			int answer = 0;
			for(int j=2; j*2<=even; j++) {
				if(check[j]==false && check[even-j]==false) {
					answer++;
				}
			}
			System.out.println(answer);
		}
	}
}