알고리즘 문제풀이

[Programmers] 프로그래머스 Lv.2 소수 찾기 문제풀이(C++)

도리컴 2023. 11. 24. 12:06
반응형

핵심은

1. 재귀함수를 통해 모든 경우의 수 고려하기

2. 소수 찾기

 

근데 이렇게 오래걸리게 해도 통과가 되네???

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <string>
#include <vector>
#include <iostream>
using namespace std;
/*
시간 11:20 ~ 11:58(40분)
문자열 요소 제거하는 메서드 잘못알아서 시간 잡아먹었음
 
<문제>
한자리 숫자의 종이조각 - 붙여서 소수를 몇개 만들 수 있는지 알아내기
 
숫자 문자열 numbers -> 만들 수 있는 소수 개수 return
 
numbers길이 : 1~7
numbers : 0~9까지 수
11과 011은 같은 숫자 취급
 
 
<풀이>
굳이 다 안써도 되는 듯
시간, 메모리제한 왜 없지?? - 진짜 막 한다?
 
그러면 그냥 소수 다 찾아내서 저장한 다음,
재귀로 모든 조합 돌려가면서 판별하면 될 거 같은디
 
 
<시간>
소수 판별 - O(N)
cntNum - O(N!)
겁나 오래걸리겠지만, 시간제한이 없어서 일단 진행..
*/
 
int dp[10000001];
 
bool isPrime(int n){    //소수판별하기
    
    if(dp[n]>=1return false;  //방문한 소수면 또 셀 필요 없음
    if(n < 2return false;
    
    dp[n]++;
 
    if(n==2return true;
    
    for(int i=2; i<n; i++){
        if(n%i==0return false;
    }    
    return true;
}
 
//string 문자열에서 모든 경우의 수 고려해서 카운트하기 - 재귀
int cntNum(int cur_num, string numbers){
    
    int cnt = 0;
  
    //하나 남은 경우 - 더하고 결과리턴
    if(numbers.size()==1){
        cur_num*=10; cur_num+=numbers[0]-'0';   //문자열 추가
        
        if(isPrime(cur_num)) cnt++;
        return cnt;
    }
    else{   //문자열 여러개 남은 경우 - 하나하나 더해서 재귀로 넘기기
 
        for(int i=0; i<numbers.size(); i++){    //문자열 추가해서 보기
            int target = cur_num;   //현재 상황에서 재귀로 넘길 cur_num
            string numbers_target = numbers;    //복사해서 뺄 거 빼고 재귀로 넘길거
            
            target*=10; target+=numbers_target[i]-'0';   //문자열 숫자값 추가
            numbers_target.erase(i, 1);   //numbers에서 제거
            
            if(isPrime(target)) cnt++;
            cnt+=cntNum(target, numbers_target);
        }
        return cnt;
    }
}
 
int solution(string numbers) {
    int answer = 0;
 
    for(int i=0; i<10000000; i++)
        dp[i]=0;   //방문여부
    
    //numbers 모든 경우의 수 고려
    answer = cntNum(0, numbers);
    return answer;
}
cs
반응형