250x250
반응형
Notice
Recent Posts
Recent Comments
Link
N
(SWEA c++)5986. 새샘이와 세 소수 본문
728x90
반응형
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
dfs를 이용해 세 소수의 합이 N과 같은 경우의 수를 구하도록 한다.
우선 소수를 판별하기 위해 bool형 벡터 prime에 에라토스테레스의 체를 활용한
소수인 수들을 false로 둔다.
(소수 관련 글은 아래 링크..!)
(프로그래머스 c++)소수 찾기
소수 찾는 기본적인 문제..! 종종 알고리즘 문제를 풀다보면 나오는 것 같다..! 그래서 풀이 형태를 외워두는 게 나을 것 같다..! 전역 변수로 1000001 크기의 bool 형태 배열을 선언해준다. 2부터 n까
eunchanee.tistory.com
dfs를 호출하여 찾도록 한다.
우선 탈출 조건으로 현재 합이 N을 넘는지, 세 수를 더했는지 확인을 해준다.
만약 현재 합이 N과 같고, count가 3이면 ans++을 해주도록 한다.
아니라면 for문을 통해 소수를 더해주도록 한다.
중복이 가능하기 때문에 start 변수로 소수의 시작 부분을 지정해주도록 한다.
현재의 합 + p[i]가 N보다 작다면 dfs를 호출하여 계속 파고들도록 한다.
count나 합을 계속 더해나가면서 탐색을 하면 된다..!
#include <iostream>
#include <vector>
using namespace std;
int N = 0;
int ans = 0;
vector<bool> prime(1000, false);
vector<int> p;
void dfs(int current, int count, int start)
{
if(current >= N || count >= 3)
{
if(current == N && count == 3)
ans++;
return;
}
for(int i = start; i < p.size(); i++)
{
if(current + p[i] <= N)
dfs(current + p[i], count + 1, i);
else
return;
}
}
int main(void)
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
for(int i = 2; i <= 999; i++)
{
if(!prime[i])
{
p.push_back(i);
for(int j = i + i; j <= 999; j += i)
prime[j] = true;
}
}
for(int tc = 1; tc <= t; tc++)
{
ans = 0;
cin >> N;
dfs(0, 0, 0);
cout << "#" << tc << " " << ans << endl;
}
return 0;
}
728x90
반응형
'SW Expert Academy' 카테고리의 다른 글
(SWEA c++)6057. 그래프의 삼각형 (0) | 2020.11.18 |
---|---|
(SWEA c++)6019. 기차 사이의 파리 (0) | 2020.11.18 |
(SWEA c++)5948. 새샘이의 7-3-5 게임 (0) | 2020.11.16 |
(SWEA c++)5789. 현주의 상자 바꾸기 (0) | 2020.11.16 |
(SWEA c++)5688. 세제곱근을 찾아라 (0) | 2020.11.16 |