-
[백준 1644] 소수의연속합알고리즘/Brute Force 2019. 12. 16. 18:04
Type : 브루트포스
접근
n 이하의 모든 소수를 저장한 배열을 만든다.
소수 배열을 만들때는 에라토스테네스의 체를 활용 한다에라토스테네스의 체
- 2부터 n 까지의 소수를 구하는 방법 이다.
- x의 배수는 x를 약수로 가진다는 원리를 이용 한다.
- 2부터 n까지 순회 하며
- 만약 숫자가 소수 라면
- (숫자 + 숫자) ~ n 까지 순회
- 소수[숫자]는 false
- 숫자 = 숫자 + 숫자
- (숫자 + 숫자) ~ n 까지 순회
- 만약 숫자가 소수 라면
- 부분 합 문제와 동일하게 투포인터 알고리즘을 활용하여
소수 만으로 n을 만들 수 있는 경우의 수를 구한다
주의할 점
(1)인덱스 초과 에러를 방지 하기 위해 탐색 범위를 n 이 아닌 vector의 size로 지정 해야 한다
(2)n이 1로 주어질때는 만들 수 있는 소수가 없기 때문에 소수 배열에 접근하려고 할때 인덱스 에러 발생 함- 1일때만 0을 바로 출력후 종료
플로우 차트
(1) 소수 배열 생성을 위한 build
(2) 가능한 수 카운트를 위한 solve구현 코드
#include <iostream> #include <vector> #define limit 4000001 using namespace std; vector<int> primes; int n; void solve(){ int i, j, sum, cnt; i = j = cnt = 0; sum = primes[i]; int size = primes.size(); while(i < size && j < size){ if(sum < n){ sum += primes[++i]; }else if(sum == n){ cnt++; sum += primes[++i]; }else if(sum > n){ sum -= primes[j++]; if(j > i){ sum = primes[j]; i = j; } } } cout<<cnt<<endl; } void build(){ bool prime[n+1]; fill_n(prime, n+1, true); for(int i = 2 ; i <= n ; i++){ if(!prime[i]) continue; for(int j = i+i ; j <= n ; j+=i) prime[j] = false; } for(int i = 2 ; i <= n ; i++){ if(prime[i]){ primes.push_back(i); } } } int main(int argc, const char * argv[]) { cin>>n; if(n==1){ cout<<0<<endl; return 0; } build(); solve(); return 0; }
깨달은 점
- 1은 소수가 아니다. 소수는 2부터 시작된다.
- 순회 범위를 잘 생각하여 지정해주어야 한다.
'알고리즘 > Brute Force' 카테고리의 다른 글
[백준 9663] N-Queen (0) 2019.12.25 [백준 2580] 스도쿠 (0) 2019.12.25 [백준 1806]부분합 (0) 2019.12.16 [백준 13460] 구슬탈출 2 (0) 2019.12.11 [백준 1062] 가르침 (0) 2019.12.09