https://programmers.co.kr/learn/courses/30/lessons/12921
코딩테스트 연습 - 소수 찾기
1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요. 소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다. (1은 소수가 아닙니다.) 제한 조건 n은 2이상
programmers.co.kr
1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요.
소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다.
(1은 소수가 아닙니다.)
제한 조건
- n은 2이상 1000000이하의 자연수입니다.
입출력 예
nresult
10 | 4 |
5 | 3 |
입출력 예 설명
입출력 예 #1
1부터 10 사이의 소수는 [2,3,5,7] 4개가 존재하므로 4를 반환
입출력 예 #2
1부터 5 사이의 소수는 [2,3,5] 3개가 존재하므로 3를 반환
-------------------------------------------------------------
연습문젠데 가볍지 뭐~ 하면서 이중 for문으로 풀었다가 시간 초과가 떠 버렸다.
더 쉬운 방법이 있는 건가 싶어 질문탭을 보고 '에라토스테네스의 체'라는 알고리즘을 알게 됐다.
에라토스테네스의 체 - 위키백과, 우리 모두의 백과사전
수학에서 에라토스테네스의 체는 소수를 찾는 방법이다. 고대 그리스 수학자 에라토스테네스가 발견하였다. 알고리즘[편집] 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서
ko.wikipedia.org
한마디로 소수 2부터 시작해서 소수값의 배수를 소수가 아닌걸로 판명지으는 과정을 계속 반복하는 것이다.
그러기 위해서는 배열값이 필요하다
#include <string>
#include <vector>
using namespace std;
int solution(int n) { //에라토스테네스의 체
int sum = 0;
bool* PrimeArray = new bool[n+1]; //2부터 ~ n-1까지 저장하는 배열 할당
for( int i = 2 ; i <= n ; i++){
PrimeArray[i] = true; //일단 전부다 소수라고 가정
}
for( int i = 2 ; i*i <= n ; i++){
if (PrimeArray[i]) //prime값 i의 배수에 대해 false값을 준다
for( int j = i*i ; j <=n ; j +=i)
PrimeArray[j] = false;
}
for( int i = 2 ; i <= n ; i++){
if( PrimeArray[i])
sum++;
}
return sum;
}
처음에는 전부 다 true(소수)로 초기화한다
그리고 2부터 3, 5, .... 의 배수를 다 false(소수x)로 할당한다
그리고 true의 개수를 반환하면 된다.
'Coding > 코딩테스트' 카테고리의 다른 글
#12913 땅따먹기 (0) | 2021.10.03 |
---|---|
프로그래머스 level1 클리어! (0) | 2021.08.28 |
LNK2019 관련 에러 해결하기 (0) | 2021.07.27 |
#67256 키패드 누르기 (0) | 2021.07.17 |
#12926 시저 암호 (0) | 2021.02.17 |