[프로그래머스] level 1 소수의 합
문제
https://programmers.co.kr/learn/courses/30/lessons/14406
코딩테스트 연습 - 소수의 합 | 프로그래머스
2부터 N까지의 모든 소수의 합을 구하세요. N이 7이라면 {2,3,5,7} = 17을 출력 하시면 됩니다. N의 범위는 2이상 10,000,000이하 입니다. 효율성 테스트의 모든 시간 제한은 1초입니다. 본 문제는 엄주용 님이 제작해주신 문제입니다.
programmers.co.kr
풀이
1) 처음에 스스로 짰던 시간 초과 코드(C++)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#include <iostream>
using namespace std;
bool is_prime(int n) {
bool chk = true;
for (int i = 2; i < n; i++) {
if (n%i == 0) {
chk = false;
break;
}
}
return chk;
}
long long solution(int N) {
int answer = 0;
for (int i = 2; i <= N; i++) {
if (is_prime(i))
answer+=i;
}
return answer;
}
|
이 코드는 정확성 테스트는 모두 통과했지만, 효율성 테스트에서는 모두 실패했습니다.
성능을 향상시키기 위해서 구글 검색을 했고, 에라토스테네스 체라는 개념을 이용하면 훨씬 효율적인 코드를 작성할 수 있는 것을 알게 되었습니다.
2) 에라토스테네스 체 방식 코드(C++)
이 방식은 제일 작은 소수인 2부터 배수를 모두 배제하는 방식입니다.
자기 자신을 제외한 배수들을 차례로 지워가다보면 결과적으로 소수만 남게 되는 방식입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#include <vector>
#include <math.h>
using namespace std;
long long solution(int N) {
long long answer = 0;
vector<int> vec = vector<int>(N+1);
for (int i = 2; i <= N; i++)
vec[i] = i;
for (int i = 2; i < sqrt(N+1); i++) {
for (int j = i + i; j <= N; j += i) {
vec[j] = 0;
}
}
for (int i = 2; i <= N; i++)
if (vec[i]!=0)
answer += i;
return answer;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
출처
에라토스테네스의 체 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 둘러보기로 가기 검색하러 가기 수학에서 에라토스테네스의 체는 소수(소쑤)를 찾는 방법이다. 고대 그리스 수학자 에라토스테네스가 발견하였다. 알고리즘[편집] 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서 회색 사각형으로 두른 수들이 여기에 해당한다. 2는 소수이므로 오른쪽에 2를 쓴다. (빨간색) 자기 자신을 제외한 2의 배수를 모두 지운다. 남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다. (초
ko.wikipedia.org