[알고리즘/C++] 조합
- 목차
조합은 "순서가 없는" 뽑기
예를들어, 1,2,3,4,5 중에 3개를 뽑는 조합을 모두 찾아야 한다면
1,2,3 / 1,2,4 / 1,2,5 / 1,3,4 / 1,3,5 / 1,4,5 / 2,3,4 / 2,3,5 / 2,4,5 / 3,4,5
총 10개가 된다.
여기서 1,2,3 세개가 뽑힌 것에서는 순서가 없다. (2,1,3 이든 3,2,1 이든 똑같은 경우로 따짐)
만약 1,2,3,4,5 중에 5개를 뽑는 조합을 찾아야 한다면
1,2,3,4,5가 모두 뽑힌 딱 한 경우 밖에 없다.
3,2,1,5,4 와 같이 순서가 바뀐 경우도 같은 경우인 것이다.
조합은 중첩for문으로 구현이 가능하다.
- 조합 코드
#include <iostream>
#include <vector>
using namespace std;
vector<int> v{ 1,2,3,4,5 };
int n = v.size();
int main() {
for (int i = 0; i < n; i++) {
for (int j = 0; j < i; j++) { // for(int j = i+1; j<n; j++) 도 가능
for (int k = 0; k < j; k++) { // for(int k = j+1; k<n; k ++)
cout << i << " " << j << " " << k << '\n';
}
}
}
return 0;
}
이런 식으로 3개를 뽑는다면 for문을 3개를 써야한다.
그런데, 4개를 뽑는 다거나 그 이상으로 더 많은 개수를 뽑는다면 for문을 더 많이 중첩해야한다.
그렇게 되면 시간이 오래 걸릴 수 있다.
그래서 조합은 재귀함수로 구현하는 것이 권장된다고 한다.
재귀함수로 구현하는 코드는 다음 게시글에 정리할 것이다.
(한 두개 뽑는 경우라면 for문으로 간단하게 구현해도 OK)
- 조합 공식

위 공식에 대입해서 조합의 개수가 몇개가 나오는지 계산할 수 있다.
'프로그래밍 > 알고리즘 개념' 카테고리의 다른 글
| [알고리즘/C++] 중복된 요소 제거하는 방법 (0) | 2024.02.28 |
|---|---|
| [알고리즘/C++] 재귀함수로 조합 구현하기 (1) | 2024.02.27 |
| [알고리즘/C++] 재귀함수로 순열 구현하기 (1) | 2024.02.27 |
| [알고리즘/C++] 순열 (0) | 2024.02.26 |
| [알고리즘/C++] split()함수 구현하기 (0) | 2024.02.23 |