Coding Test/programmers
[프로그래머스] 소수 만들기 c++
owls
2022. 8. 19. 14:39
728x90
문제 설명
주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.
제한 사항
- nums에 들어있는 숫자의 개수는 3개 이상 50개 이하입니다.
- nums의 각 원소는 1 이상 1,000 이하의 자연수이며, 중복된 숫자가 들어있지 않습니다.
입출력 예
nums | result |
[1,2,3,4] | 1 |
[1,2,7,6,4] | 4 |
풀이
다른 사람들이 푼 풀이들도 봤는데 이중for문, 삼중 for문 등등 for문을 이용해서 푼거 같았다.
나는 이 문제를 dfs로 풀었다.
PrimeNum함수는 소수를 판별하는 함수이다.
dfs는 check배열로 방문 표시하였다. 배열 중 3개가 true인지 확인하고, true인 배열 원소들을 더한다.
이 때 더한 값이 소수인지 판별하고 소수라면 reuslt 값을 +1 한다.
#include <vector>
#include <iostream>
#include <cmath>
using namespace std;
bool check[51];
int result = 0;
const bool PrimeNum(int n){
for (int i = 2; i <= sqrt(n); i++) {
if (n%i == 0) {
return false;
}
}
return true;
}
void dfs(int l , int s, vector<int> nums){
if( l == 3){
int sum = 0;
for(int i = 0; i < nums.size(); i++){
if(check[i]){
sum += nums[i];
}
}
if(PrimeNum(sum)){
result++;
}
}
else{
for(int i = s; i < nums.size(); i++){
check[i] = true;
dfs(l+1, i+1, nums);
check[i] = false;
}
}
}
int solution(vector<int> nums) {
int answer = -1;
dfs(0,0, nums);
answer = result;
return answer;
}
728x90