반응형
소수의 합
문제
2부터 N까지의 모든 소수의 합을 구하세요.
N이 7이라면 {2,3,5,7} = 17을 출력 하시면 됩니다.
N의 범위는 2이상 10,000,000이하 입니다.
효율성 테스트의 모든 시간 제한은 1초입니다.
링크:https://programmers.co.kr/learn/courses/30/lessons/14406#
풀이
내 생각대로 풀어보았지만 효율성 테스트 두개를 통과하지 못했다. 처음 했던 방법은 다음에서 나왔다.
1. 소수는 2를 제외한 짝수를 배수로 가지지 않는다.
>2를 제외한 모든 소수는 홀수이다.
2. N의 제곱근 밑 또는 위로의 숫자들만 나누어서 나머지가 0인지 확인해본다
> N = a * b 일때 a와 b 중 하나는 √N 보다 작고 나머지는 크기때문이다. ex) N=12 일때 √12 ≒ 3.5 이고 자신과 1을 제외한 12의 약수는 3, 4 이다.
이것을 C++ 코드로 만들면 다음과 같다 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include <vector> using namespace std; bool isPrime(int N){ for(int i=3; i*i<=N;i+=2){ // 만약 N = a * b 라면 N의 제곱근보다 a가 크다면 if(N % i == 0){ // b는 무조건 작을것이다. 또한 소수는 짝수를 배수로 가지지 않으므로 제외한다 return false; } } return true; } long long solution(int N) { long long answer = 2; //N은 2 이상이므로 2를 초기값으로 넣는다. for(int i=3;i<=N;i+=2) //3부터 시작하여 2씩 더하여 짝수를 거른다. { if(isPrime(i)){ answer+=i; } } return answer; } | cs |
그리고 결과
결국 인터넷을 찾아보게 되었고 에라토스테네스의 체에 대해서 알게 되었다.
- 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서 회색 사각형으로 두른 수들이 여기에 해당한다.
- 2는 소수이므로 오른쪽에 2를 쓴다. (빨간색)
- 자기 자신을 제외한 2의 배수를 모두 지운다.
- 남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다. (초록색)
- 자기 자신을 제외한 3의 배수를 모두 지운다.
- 남아있는 수 가운데 5는 소수이므로 오른쪽에 5를 쓴다. (파란색)
- 자기 자신을 제외한 5의 배수를 모두 지운다.
- 남아있는 수 가운데 7은 소수이므로 오른쪽에 7을 쓴다. (노란색)
- 자기 자신을 제외한 7의 배수를 모두 지운다.
- 위의 과정을 반복하면 구하는 구간의 모든 소수가 남는다.
그림의 경우, 이므로 11보다 작은 수의 배수들만 지워도 충분하다. 즉, 120보다 작거나 같은 수 가운데 2, 3, 5, 7의 배수를 지우고 남는 수는 모두 소수이다.
이것을 코드로 나타내면 다음과 같다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <vector> using namespace std; long long solution(int N) { long long answer = 0; vector<bool> eratos(N+1); for(int i=2;i<=N;i++) { if(!eratos[i]){ //값이 false면 answer에 더하고 answer +=i; } for(int j=i;j<=N;j+=i){ //그 값에 배수를 모두 true로 바꿔준다. eratos[j] = true; } } return answer; } | cs |
결과는 정답이다. 분발하자..
반응형
'군대에서 한것 > 프로그래머스' 카테고리의 다른 글
<프로그래머스> Level1 K번째수 (0) | 2019.01.05 |
---|---|
<프로그래머스> Level1 같은 숫자는 싫어 (0) | 2019.01.05 |
<프로그래머스> Level1 시저 암호 (0) | 2019.01.05 |
<프로그래머스> Level1 수박수박수박수박수박수? (0) | 2019.01.02 |
<프로그래머스> Level1 완주하지 못하는 선수 (0) | 2019.01.02 |