C++ - 조합 및 순열

2020. 6. 23. 17:11·Language/C++

C++에서는 next_permutation을 활용하여 순열과 조합을 만들수 있습니다. 그러면 직접 보면서 순열, 조합에 대해 알아봅시다~

먼저 순열에 대해 보도록 하겠습니다

 

중복이 있는 원소들의 경우

중복이 있는 원소의 경우 중복인 경우를 제외하고 순열을 만들어줍니다. 즉, 예를 들어서 0 1 1이 있다면 아래와 같은 경우만 순열을 출력해줍니다.

#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
int main (){
	vector<int> v;
	// 0 1 1 대입
	v.push_back(0);
	v.push_back(1);
	v.push_back(1);
	// 정렬
	sort(v.begin(), v.end());
	//순열
	do{
		// 출력
		for(int i=0; i<v.size(); i++){
			printf("%d ", v[i]);
		}
		printf("\n");
	}while(next_permutation(v.begin(), v.end()));

	return 0;
}
0 1 1
1 0 1
1 1 0

next_permutation을 이용해 조합(Combinataion) 구하기

원리: 전체 n개의 원소들 중에서 k개를 뽑는 조합(=nCk)을 구한다면 n개의 벡터 원소에 1을 k개 0을 나머지인 n-k개 집어넣어서 순열을 돌리고 1에 해당하는 인덱스만 가져오면 된다.

 

1부터 6까지의 수 중에서 4개를 뽑아서 조합을 만들어보자.

#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;

int main (){
	// 1부터 6까지 담을 벡터
	vector<int> n;
    
	// 1부터 6까지 생성
	for(int i=0; i<6; i++){
		n.push_back(i+1);
	}
	// 0과1을 저장 할 벡터 생성
	vector<int> ind;
    
	// k=4, 4개를 뽑으니까
	int k = 4;
    
	// k개의 1 추가
	for(int i=0; i<k; i++){
		ind.push_back(1);
	}

	// 2개(6개-2개)의 0 추가
	for(int i=0; i<n.size()-k; i++){
		ind.push_back(0);
	}

	// 정렬
	sort(ind.begin(), ind.end());

	//순열
	do{
		// 출력
		for(int i=0; i<ind.size(); i++){
			if(ind[i] == 1){
				printf("%d ", n[i]);
			}
		}
		printf("\n");
	}while(next_permutation(ind.begin(), ind.end()));

	return 0;
}
3 4 5 6
2 4 5 6
2 3 5 6
...
1 2 3 6
1 2 3 5
1 2 3 4

 

출처: twpower.github.io/90-combination-by-using-next_permutation

저작자표시 (새창열림)

'Language > C++' 카테고리의 다른 글

C++ - Quick Sort (feat Algorithm qsort())  (0) 2020.06.23
C++ - 중복제거  (0) 2020.06.23
C++ - String 클래스, 문자열 총정리  (0) 2020.06.19
C++ - 1차원 배열에서의 시계방향, 반시계 방향 (feat: rotate)  (0) 2020.05.01
C++ - n x n 2차원 배열에 대한 조작 (90도 회전 / 점대칭 / 선대칭)  (1) 2020.04.21
'Language/C++' 카테고리의 다른 글
  • C++ - Quick Sort (feat Algorithm qsort())
  • C++ - 중복제거
  • C++ - String 클래스, 문자열 총정리
  • C++ - 1차원 배열에서의 시계방향, 반시계 방향 (feat: rotate)
dev.wookii
dev.wookii
Effort Maketh Happiness
  • dev.wookii
    습관처럼
    dev.wookii
  • 전체
    오늘
    어제
    • 분류 전체보기 (295)
      • Language (35)
        • python (13)
        • C++ (22)
      • Kaggle (4)
      • Algorithms (112)
        • BOJ (58)
        • programmers (43)
        • SWExpertAcademy (2)
      • Certification (38)
        • Adsp (0)
        • Sqld (28)
        • 정처기 (9)
        • 빅데이터 분석기사 (0)
      • Data Analysis & ML (6)
      • 금융 & 디지털 (65)
      • CS (32)
        • DB (2)
        • SE (3)
        • Web&JSP (1)
        • Network (11)
        • OS (2)
        • Linux&Unix (6)
        • Server (1)
        • UX,UI (1)
        • 보안 (5)
      • 기타 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    2020 KAKAO
    programmers
    funny algorithms
    Ebay korea #coding test
    시뮬레이션
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
dev.wookii
C++ - 조합 및 순열
상단으로

티스토리툴바