골드바흐의 추측과
에라토스테네스의 체를 활용
위 두 개념은 starmk95.tistory.com/45 링크에서 설명
알고리즘) 수학 - 나머지 연산, 최대공약수(GCD), 최소공배수(LCM), 소수, 팩토리얼
1. 나머지 연산 - 덧셈 : (A+B)modM = ((AmodM)+(BmodM))modM - 곱셍 : (A*B)modM = ((AmodM)*(BmodM))modM - 뺄셈 : (A-B)modM = ((AmodM)-(BmodM)+M)modM cf) 왜 덧셈, 곱셈과 달리 +M을 해주는가? ex) ((..
starmk95.tistory.com
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
static ArrayList<Integer> prime;
static boolean[] check;
public static void main(String[] args) {
prime = new ArrayList<>();
findPrime();
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); // 테스트 케이스의 개수
for (int i=0;i<n;i++) {
int even = sc.nextInt(); // 짝수 입력 받기
findPartitionNum(even);
}
}
// 먼저 2 이상 1000000 이하의 소수들을 구한다. (입력 범위 내의 소수)
// 소수들을 구하기 위해서는 에라토스테네스의 체를 사용한다.
// 약 0.01초보다 덜 걸림
public static void findPrime() {
check = new boolean[1000001]; // 에라토스테네스의 체 구현 (true면 지워진 것, false면 지워지지 않은 것)
for (int i=2;i<=1000000;i++) {
if (!check[i]) { // 지워지지 않은 가장 작은 값을 구하기
prime.add(i); // 해당 수는 소수이다. (소수 리스트에 추가)
}
for (int j=i*2;j<=1000000;j+=i) {
// i의 최대값이 1000000이므로 i*i가 int 범위를 넘어가기 때문에 i*2부터 시작
// i가 백만 이하의 수라면 i*i가 int의 범위 이내이므로 i*i부터 시작
// i*i부터 시작하는 이유는 i*i보다 작은 i의 배수들은 이미 i보다 작은 소수들의 배수에 의해 처리되었기 때문에
// 따로 처리할 필요가 없기 때문이다.
check[j] = true; // 소수의 배수들 지워주기
}
}
}
public static void findPartitionNum(int even) {
int cnt = 0; // 골드바흐 파티션의 개수
for (int x : prime) { // 범위 내 모든 소수들에 대해 확인
if (x <= even/2) { // 두 소수의 합의 순서만 다른 것은 같은 파티션 취급하므로 짝수의 반보다 같거나 작은 소수들에 대해 판별
if (!check[even-x]) cnt+=1; // 짝수에서 해당 소수를 뺀 값이 소수라면 파티션 개수 하나 증가
} else break; // 짝수의 반보다 큰 값에 대해서는 처리할 필요 없음 (중복이거나 소수다 짝수보다 큰 경우임)
}
System.out.println(cnt); // 해당 짝수의 골드바흐 파티션의 개수 출력
}
}
문제 출처 : www.acmicpc.net/problem/17103
'알고리즘 > 백준 알고리즘(JAVA)' 카테고리의 다른 글
Java)11576번 Base Conversion (진법 변환) (0) | 2020.09.03 |
---|---|
Java)2089번 -2진수 (0) | 2020.09.03 |
JAVA)1707번 이분 그래프 - DFS (0) | 2020.08.21 |
JAVA)11724번 연결 요소의 개수 - 그래프, DFS (0) | 2020.08.19 |
JAVA)DFS와 BFS - 그래프의 구현(인접 리스트), DFS, BFS (0) | 2020.08.19 |
알고리즘
69개Java)17103번 골드바흐 파티션 - 수학(소수, 골드바흐의 추측)
골드바흐의 추측과 에라토스테네스의 체를 활용 위 두 개념은 starmk95.tistory.com/45 링크에서 설명 알고리즘) 수학 - 나머지 연산, 최대공약수(GCD), 최소공배수(LCM), 소수, 팩토리얼 1. 나머지 연산 - 덧셈 : (A+B)modM = ((AmodM)+(BmodM))modM - 곱셍 : (A*B)modM = ((AmodM)*(BmodM))modM - 뺄셈 : (A-B)modM = ((AmodM)-(BmodM)+M)modM cf) 왜 덧셈, 곱셈과 달리 +M을 해주는가? ex) ((.. starmk95.tistory.com import java.util.ArrayList; import java.util.Scanner; public class Main { static ArrayLis..
알고리즘/백준 알고리즘(JAVA) 2020.09.03 starmk95Java)11576번 Base Conversion (진법 변환)
먼저 A진법 수를 10진법으로 변환하고, 변환된 10진법 수를 B진법으로 변환한다. import java.util.Scanner; public class Main { static int[] num; static int A; static int B; public static void main(String[] args) { Scanner sc = new Scanner(System.in); A = sc.nextInt(); B = sc.nextInt(); int m = sc.nextInt(); num = new int[m]; for (int i=m-1;i>=0;i--) { // 낮은 자리 수일수록 낮은 인덱스에 저장 num[i] = sc.nextInt(); } toB(to10()); System.out.prin..
알고리즘/백준 알고리즘(JAVA) 2020.09.03 starmk95Java)2089번 -2진수
일반적인 진수 변환법을 적용해서 푸는데 음수/음수의 경우 발생하는 예외를 처리해주어야한다. 주석 참고 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int num = sc.nextInt(); if (num == 0) { System.out.println(0); } else { convert(num); System.out.println(); } } /* 진수 변환법 2진수일 때, 10 = 2*5 + 0 5 = 2*2 + 1 2 = 2*1 + 0 1 = 2*0 + 1 이에 따라, 10을 2진수로 표현하면 1010이된다. -2진수도 위와..
알고리즘/백준 알고리즘(JAVA) 2020.09.03 starmk95JAVA)1707번 이분 그래프 - DFS
그래프의 정점의 집합을 둘로 분할하여, 각 집합에 속한 정점끼리는 서로 인접하지 않도록 분할할 수 있을 때, 그러한 그래프를 특별히 이분 그래프 (Bipartite Graph) 라 부른다. dfs로 정점들을 탐색하며 간선으로 연결된 정점들은 다른 집합에 속하도록 한다. check[x] == 1 또는 2 // 집합 1 또는 2에 넣기 (0이면 방문 안한 정점) 입력 예제는 성공했지만 계속 4초에서 3초로 넘어가는 중에 실패처리가 나와서 의문이였는데 그래프가 2개 이상의 연결요소로 구성된 경우를 처리하지 않았기 때문이라는 것을 깨달았다. (그래프의 모든 정점들이 연결되어 있지 않고 섬처럼 떨어져 있을 수도 있다는 것) import java.util.*; public class Main { static Arr..
알고리즘/백준 알고리즘(JAVA) 2020.08.21 starmk95JAVA)11724번 연결 요소의 개수 - 그래프, DFS
그래프의 연결 요소를 확인하는 방법은 임의의 정점에서 DFS 또는 BFS 탐색을 수행한 후에도 방문하지 않은 정점이 남아있다면, 다른 연결요소가 있다는 특성을 이용한 것이다. 모든 정점들에 대하여 각 정점을 방문했는지 확인하고, 방문하지 않은 정점이 있다면 연결요소의 개수를 1개 추가하고 해당 정점에서 다시 탐색을 수행한다. import java.util.*; public class Main { static ArrayList[] graph; // 인접 리스트로 그래프 구현 static boolean[] check; // 정점 방문 여부 확인하는 배열 static void dfs(int x) { if (check[x]) return; // 이미 방문한 정점이면 해당 정점에서는 탐색 안함 check[x] =..
알고리즘/백준 알고리즘(JAVA) 2020.08.19 starmk95JAVA)DFS와 BFS - 그래프의 구현(인접 리스트), DFS, BFS
리스트(그래프)의 원소(정점) 접근은 for each문을 사용하여 처리한다. (for문과 get()메소드로 인덱스를 사용해 접근하는 것보다 빠르기 때문) 위의 이유에 대해서는 하단 링크 참고 https://starmk95.tistory.com/110 JAVA) 리스트에는 for문 대신 for each 문을 사용하자 ArrayList 자료구조를 예시로 들어 설명하면 ArrayList.get(인덱스) 메소드를 실행하면 내부적으로 해당 인덱스를 찾기 위해 루프가 돌게 된다고 한다. 그렇기 때문에 리스트의 원소에 접근할 때, for ea starmk95.tistory.com 인접 리스트를 사용해 그래프를 구현했고 DFS는 재귀, BFS는 Queue를 통해 구현했다. import java.util.*; publi..
알고리즘/백준 알고리즘(JAVA) 2020.08.19 starmk95JAVA)10820번 문자열 분석 - Character 클래스의 메소드, eof 처리
import java.io.*; public class Main { public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String temp; while ((temp = br.readLine()) != null) { // eof 처리 int upper = 0; int lower = 0; int num = 0; int space = 0; for (int i=0;i
알고리즘/백준 알고리즘(JAVA) 2020.08.18 starmk95JAVA)10824번 네 수 - 자료형
문제가 쉬워보이는데 오답률이 높길래 의아해서 풀었다가 나도 틀려서 당황한 문제 문제의 요구사항(조건)을 잘 확인해야 한다는 것을 느낄 수 있는 문제였다. 문제의 포인트는 알맞는 자료형을 사용하는 것 문제에서 주어지는 4개의 자연수의 각 최대 값은 1,000,000 A와 B를 이어붙인 수는 10,000,001,000,000이 되는데, 이는 int 자료형의 범위를 넘어간다. 그러므로 long 자료형을 사용해서 A, B와 C, D가 이어진 수와 그 합을 처리해줘야한다. import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String A = sc.next..
알고리즘/백준 알고리즘(JAVA) 2020.08.18 starmk95JAVA)1918번 후위 표기식 - 스택(Stack)
해당 문제를 해결하기 위해 괄호에 의한 우선 순위 뿐만 아니라 사칙연산의 연산자들 간의 우선 순위도 고려해야 한다. (괄호) > *, / (곱셈, 나눗셈) > +, - (덧셈, 뺄셈) # 알고리즘 모든 수식의 입력들 처리할 때까지 반복 1. 입력이 피연산자(알파벳)이면 바로 출력문에 append() 2. 입력이 열린 괄호 "("이면 바로 출력문에 append() 3. 입력이 + 또는 - 이면 1) 스택이 비어있다면 바로 push() 2) 스택이 비어있지 않다면 계속 pop()하고 append() a) 스택이 비면 중지 b) 열린 괄호 "("를 만나면 중지 a 또는 b 과정 끝나면 입력된 연산자 push 4. 입력이 * 또는 / 이면 1) 스택이 비어있다면 바로 push() 2) 스택이 비어있지 않다면 계..
알고리즘/백준 알고리즘(JAVA) 2020.08.18 starmk95알고리즘) 트리(Tree)
# 트리 : 사이클이 없는 연결 그래프 1. 사이클이 없다 2. 연결되어 있다. 3. 그래프이다. 트리의 정점의 개수 = V, 트리의 간선의 개수 = V-1 (정점이 N개, 간선이 N개면 사이클이 1개만 존재하게 된다.) cf) 트리라고 무조건 루트가 존재하는 것은 아니다. 루트는 정하기에 따라 달라진다. # 트리에서의 부모(parent), 자식(child), 단말 노드(leaf node) 위 예시에서 루트 = 노드 1로 정의했을 때, 노드 1의 자식 = 노드 2, 노드 3 노드 2의 부모 = 노드 1 (루트 노드(노드 1)의 부모는 존재하지 않는다.) 해당 트리의 단말 노드 = 노드 4, 5, 6, 7 노드 2의 형제(sibling) 노드 = 노드 3 # 깊이(Depth) : 루트로부터 노드의 거리 깊..
알고리즘 2020.08.17 starmk95알고리즘) 그래프의 탐색 - DFS, BFS
# 그래프의 탐색의 목적 임의의 정점에서 시작하여 연결되어 있는 모든 정점을 1번씩 방문하는 것 (1번 이상 방문하면 그것은 DFS, BFS가 아님) DFS, BFS는 어떤 순서로 정점을 방문하는 것인가에 차이를 갖는다. # DFS (깊이 우선 탐색) 한 정점에서 시작하여 최대한 깊게 탐색(새로운 연결된 정점이 없을 때까지)하고 더 이상 깊게 탐색할 정점이 없으면 탐색해온 경로를 되돌아오면서 다시 탐색한다. (새로운 정점 : 방문한 적이 없는 정점) (사람 1명이 탐색을 하는 것이라고 비유할 수 있다.) # BFS (너비 우선 탐색) 탐색을 시작한 정점부터 각 정점에서 방문 가능한(연결되어 있는) 모든 새로운 정점들을 1번에 확인하는 방식으로 탐색한다. (사람이 연결된 정점의 수만큼 복제되면서 탐색하는 ..
알고리즘 2020.08.17 starmk95JAVA)13023번 ABCED - 그래프(인접 행렬, 인접 리스트, 간접 리스트)
import java.util.*; class Edge { // 간접 리스트를 위한 클래스 int from, to; Edge(int from, int to) { this.from = from; this.to = to; } } public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); // 사람 수 int m = sc.nextInt(); // 관계 수 boolean[][] a = new boolean[n][n]; // 인접 행렬 구현 ArrayList[] g = (ArrayList[]) new ArrayList[n]; // 인접 리스트 구현 ArrayL..
알고리즘/백준 알고리즘(JAVA) 2020.08.17 starmk95