-
소수만들기프로그래머스(Programmers) 2021. 11. 10. 22:50반응형
=> DFS를 사용하여 풀 수 있는 문제입니다.
=> DFS를 사용하며 시작하는 INDEX를 하나씩 늘려가며 중복되는 수의 조합은 제외하였습니다.
=> DFS를 사용하며 Parameter들의 값이 실제로 올라가는 것인지, 넘기는 값만 올라가는 것인지, 주소를 참조하는 것인지 등을 잘 판단하여 써야 합니다.
=> 소수인지를 판별하는 함수를 생성하여 소수를 판별하여 전역변수에 소수 여부를 기록하였습니다.
*1은 소수가 아니며 2는 소수이므로 미리 표시해둡니다.
=> 시간초과의 경우에 걸리지 않도록 return문을 잘 넣어줍니다.
if(cntAdd == 3) { if(prime[sum]) { cnt++;return; } Prime(sum); if(prime[sum]) { cnt++; } return; }
=> 해당부문에서 return을 잘못 넣어 시간 초과가 걸렸습니다.
#include <vector> #include <iostream> #include <cmath> using namespace std; bool prime[3001]; bool check[51]; int cnt=0; void Prime(int tmp) { for(int i=2; i<sqrt(tmp)+1; i++) { if(tmp%i ==0) { prime[tmp]=false; return; } } prime[tmp]=true; } void dfs(int index,int sum, int cntAdd, vector<int>& nums) { if(cntAdd == 3) { if(prime[sum]) { cnt++;return; } Prime(sum); if(prime[sum]) { cnt++; } return; } for(int i= index; i<nums.size(); i++) { if(!check[i]) { check[i] = true; dfs(i,sum+nums[i],cntAdd+1, nums); check[i] = false; } } } int solution(vector<int> nums) { int answer = -1; prime[1]= false; prime[2]=true; dfs(0,0, 0, nums); answer = cnt; return answer; }
반응형'프로그래머스(Programmers)' 카테고리의 다른 글
단어변환 (0) 2021.11.15 카펫 (0) 2021.11.13 신규아이디 추천 (0) 2021.11.09 최소직사각형 (0) 2021.10.14 복서 정렬하기 C++ (0) 2021.10.07