복습이 필요한 알고 팁

nCr 좀 더 간단하게 (r 이 작으면서 고정적인 값일때)

헐랭미 2020. 8. 29. 17:20

int arr[8] = { 4,1,6,3,7,6,8,10 }; 에서

원소 3개를 뽑는 모든 경우의 수를 구한다고 쳐보자.

처음엔

 

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
#include <iostream>
using namespace std;
int arr[8= { 4,1,6,3,7,6,8,10 };
int su[8];
 
void go(int su_pos, int arr_pos, long long n, long long r)
{
    if (su_pos == r)
    {
        for (int i = 0; i < r; i++)
        {
            cout << arr[su[i]] << " ";
        }
        cout << "\n";
        return;
    }
    if (arr_pos == n)
        return;
 
    su[su_pos] = arr[arr_pos];
    go(su_pos+1, arr_pos+1, n, r);
    go(su_pos, arr_pos+1, n, r);
}
 
 
int main()
{
    go(0083);
}
 
 
cs

요롷게 했다.

 

 

하지만 더 간단하게 구해보면

 

 

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
#include <iostream>
using namespace std;
int arr[8= { 4,1,6,3,7,6,8,10 };
int su[8];
 
void go(int su_pos, int arr_pos, int n, int r)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = i + 1; j < n; j++)
        {
            for (int k = j + 1; k < n; k++)
            {
                cout << arr[i] << ' ' << arr[j] << ' ' << arr[k] << '\n';
            }
        }
    }
}
 
 
int main()
{
    go(0083);
}
 
cs

이렇게도 할 수 있다. for문의 개수 = r 의 수이다.