일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 백준 1339
- 1107번
- cs231n
- 관심사분리
- MachineLearning
- 논문리뷰
- 디미터법칙
- NLP
- 1916
- 백준
- 클린코드
- 짝지어제거하기
- 머신러닝
- 백준9095
- 자바
- 다익스트라
- 백준 1339 자바
- Alexnet
- 논문
- GPT
- 알렉스넷
- 3745
- Java
- 1261
- 백준 1916 자바
- deeplearning
- dijkstra
- 알고리즘
- 논문구현
- 딥러닝
- Today
- Total
산 넘어 산 개발일지
[백준] 1644번 - 소수의 연속합(Java) 본문
풀이
키워드
- 에라토스테네스의 체
이번 문제는 척 보면 알 수 있듯이 소수를 사용하는 문제이다. 소수하면 바로 에라토스테네스의 체가 떠오른다. 에라토스테네스의 체는 범위 내의 숫자들이 소수인지 아닌지를 미리 판별해내는 계산이다. 간단히 설명하자면, 미리 1~N까지의 배열(boolean)을 만들어 놓는다. 그리고 처음에는 2부터 시작을 한다. 2를 제외한 2의 배수들은 소수가 아니므로 소수가 아니라고 마킹(false)한다. 그리고 다음 숫자 3으로 넘어간다. 3은 소수가 아니라 마킹이 안되었으므로 앞 과정과 동일하게 3을 제외한 나머지 배수들을 소수가 아니라고 마킹한다. 다음 4는 2에 의해 마킹되었으므로 넘어간다. 다음 5는 마킹이 안되었으므로 앞 3과 동일한 작업을 수행한다. 이런 과정을 N까지 반복하면 내가 원하는 숫자 K가 소수인지 아닌지를 바로 판별할 수 있다. (자세한 설명은 밑에 링크 참조)
물론 에라토스테네스의 체를 사용하기 위해서는 메모리 범위를 신경써야 한다. 이번 문제에서 N은 최대 4,000,000이므로 이를 MB로 환산한다면 (4,000,000 / 1024) / 1024 이므로 약 4mb가 나온다. 따라서 에라토스테네스의 체를 사용하기에 충분한 메모리이다.
소수인지 아닌지 판별된 배열이 있으면 연속된 소수의 합은 구해보기 쉽다. 그냥 2부터 N까지 돌아보면서 소수일 때만 숫자들의 합에 더해주고, 이것이 N과 동일해지면 count를 +1 해주고, N보다 커지면 break해주면 된다.
코드
package math;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Arrays;
public class Main01 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
boolean [] primes = new boolean[4_000_001];
// 에라토스테네스의 체
Arrays.fill(primes, true);
primes[1] = false;
for (int i = 2; i <= 4_000_000; i++) {
if (primes[i]) {
for (int j = i + i; j <= 4_000_000; j += i) {
primes[j] = false;
}
}
}
// 연속합 구하기
int count = 0;
for (int i = 2; i <= N; i++) {
int total = 0;
if (!primes[i]) {
continue;
}
for (int j = i; j <= N; j++) {
if (primes[j]) {
total += j;
if (total == N) {
count++;
}
if (total >= N)
break;
}
}
}
System.out.print(count);
}
}
출처 : https://www.acmicpc.net/problem/1644
1644번: 소수의 연속합
첫째 줄에 자연수 N이 주어진다. (1 ≤ N ≤ 4,000,000)
www.acmicpc.net
에라토스테네스의 체 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 수학에서 에라토스테네스의 체는 소수를 찾는 방법이다. 고대 그리스 수학자 에라토스테네스가 발견하였다. 알고리즘[편집] 2부터 소수를 구하고자 하는 구간
ko.wikipedia.org
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 3745번 - 오름세(Java) (0) | 2021.07.14 |
---|---|
[백준] 1261번 - 알고스팟 (Java) (0) | 2021.05.20 |
[백준] 1107번 - 리모컨(Java) (0) | 2021.04.14 |
[백준] 1916번 - 최소비용 구하기 (Java) (0) | 2021.04.07 |
[백준] 1339번 - 단어 수학 (Java) (0) | 2021.04.06 |