그 동안 난해했던 이러한 류의 코딩하는 방법을 조금은 터득한 것 같아 정리해둘려고 한다. 

1) 항상 몇 가지 나열된 원소(숫자)를 중복을 허락하지 않고 모든 경우의 수를 구해야 할 때, 

=> n!

2) 몇 가지 나열된 원소(숫자)로 만들 수 있는 모든 경우의 수 구하기

=> n * n * n * n * ......

위와 같은 수행과정이 필요할 때 재귀적으로 코딩하는 것이 만만치 않았다. 

단지 for문을 돌면서 수행 할 수도 있다.(완전 탐색의 원소의 개수를 완벽히 알 수 있을 때 말이다.)

하지만 그렇지 않을 때에는 난 감했던 적이 많았는데 다음과 같이 코딩해주면 된다. 

이 것은 지속적으로 반복기억해주어야 겠다.

 

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
#include <iostream>
using namespace std;
 
int n;
int arr[4= {1234};
bool visited[4];
int result[4];
int combination_count = 0;
 
// 4가지 수를 중복을 허락하지 않고 모든 경우의 수 구하기 => 4!
// 순열 혹은 조합? 응용 가능?
void combination(int idx){
    if (idx >= 4){
        for (int i = 0; i < 4; i++){
            cout << result[i] << " ";
        }
        cout << endl;
        combination_count++;
        return;
    }
    for (int i = 0; i < 4; i++){
        if (!visited[i]){
            result[idx] = arr[i];
            visited[i] = true;
            combination(idx + 1);
            visited[i] = false;
        }
    }
}
 
// 4가지 수로 만들 수 있는 모든 경우의 수 구하기 => 4 * 4 * 4 * 4
void recursive(int idx){
    if (idx >= 4){
        for (int i = 0; i < 4; i++){
            cout << result[i] << " ";
        }
        cout << endl;
        return;
    }
    for (int i = 0; i < 4; i++){
        result[idx] = arr[i];
        recursive(idx + 1);
    }
}
 
int main(){
    // recursive(0);
    combination(0);
    cout << combination_count << endl;
    return 0;
}
cs


3) m가지의 수들로 n자리 수를 중복을 허락하여 만드는 경우

m * m * m( ... n번)

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
#include <iostream>
using namespace std;
 
int result[7];
bool visited[7];
int casecount = 0;
 
void make_game(int idx){
    if (idx > 6) {
        casecount++;
        for (int i = 1; i <= 6; i++){
            cout << result[i] << " ";
        }
        cout << endl;
        return
    }
    for (int j = 1; j <= 3; j++){
        if (!visited[idx]){
            result[idx] = j;
            visited[idx] = true;
            make_game(idx + 1);
            visited[idx] = false;
        }
    }
}
 
int main(){
    make_game(1);
    cout << casecount << endl;
    return 0;
}
 
cs






'알고리즘' 카테고리의 다른 글

증가하는부분수열(Longest Increase Subsequence)  (0) 2015.04.26
퇴각 검색(BackTracking)  (0) 2015.04.22
DP(Dynamic Programming)패턴 연구  (0) 2015.04.03
소수 판별 알고리즘  (0) 2015.03.30
최대공약수 구하기  (0) 2015.03.25
Posted by slender ankles
,