[순열] 순열 구현하기 C++

2022. 3. 6. 15:41·알고리즘 이론

알고리즘 문제를 해결하다보면 순열과 조합을 이용해야하는 일이 빈번히 발생한다.

순열을 구현하는 방법 중 하나인 원소의 방문을 체크해 가며 구현하는 방법과 STL을 이용하는 방법을 소개하겠다.

 

 

1. 재귀를 이용한 순열 구현

 

다음 방법은 크기가 3인 모든 수열을 출력하는 방법이다.  

checked배열로 현재 vector에 들어있는 값들을 확인하고, 순열에 아직 포함되지 않은 원소를 선택하여 vector에 넣어주는 방식으로 구현하였다. 

또한 vector에 필요한 크기의 원소가 모두 들어가면 출력하는 방법으로 순열을 구할 수 있다. 

//순열구현하기
#include <iostream>
#include <vector>
using namespace std;
int arr[5];
bool checked[5];
vector<int> v;
void Input() {
	arr[0] = 1;
	arr[1] = 2;
	arr[2] = 3;
	arr[3] = 4;
	arr[4] = 5;
}

void DFS(int cnt) {

	if(cnt == 3) {
		for (int i = 0; i < 3; i++) {
			cout << v[i] << " ";
		}
		cout << "\n";
	}

	for (int i = 0; i < 5; i++) {
		if (checked[i] == true) continue;
		checked[i] = true;
		v.push_back(arr[i]);
		DFS(cnt + 1);
		v.pop_back();
		checked[i] = false;
	
	
	}



}



int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	Input();
	DFS(0);

}

 

 

 

2. STL을 활용한 방법

next_permutation함수를 사용하면 굉장히 쉬운 방법으로 순열을 찾을 수 있습니다. 

하지만 해당 함수를 사용하기 위해서는 원소들의 오름차순 정렬이 필수입니다. 

//순열구현하기
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int arr[5];
bool checked[5];
vector<int> elements{1,2,3,4,5};



int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	
	sort(elements.begin(), elements.end());

	do {
		for (auto it = elements.begin(); it != elements.end(); it++) {
			cout << *it << " ";
		
		}
		cout << "\n";

	
	} while (next_permutation(elements.begin(), elements.end()));

}

 

* next_permutation을 활용하여 조합을 구현할 수도 있습니다. 

바로 조합의 크기 만큼의 1과 나머지 크기를 0으로 채워준 vector를 선언해주면, 0과 1을 활용하여 조합을 만들 수 있습니다. 

 

만일 3개의 원소 중 1개의 원소로 조합을 만든다고 가정해 봅시다.

{0,0,1}과 같이 새로운 vector를 만듭니다.(이 역시 정렬이 필수입니다!)

 

해당 원소들을 next_permutation()을 활용해 돌리게 되면

{0,0,1}, {0,1,0}, {1,0,0}...과 같이 조합을 만들 수 있습니다. 

그리고 1인 부분의 원소를 출력하게되면 조합을 출력하게 됩니다. 

 

 

저작자표시 비영리 (새창열림)

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

[알고리즘 이론] Floyd Warshall 플로이드 와샬 알고리즘 C++  (0) 2022.02.22
[이론] 이진탐색 (Binary Search) - c++  (1) 2022.02.09
STL 컨테이너 별 사용도  (0) 2022.01.05
[알고리즘 이론] 정렬 알고리즘  (0) 2021.06.21
[알고리즘 이론] 시간 복잡도  (1) 2021.06.21
'알고리즘 이론' 카테고리의 다른 글
  • [알고리즘 이론] Floyd Warshall 플로이드 와샬 알고리즘 C++
  • [이론] 이진탐색 (Binary Search) - c++
  • STL 컨테이너 별 사용도
  • [알고리즘 이론] 정렬 알고리즘
senyalog
senyalog
개발 블로그 https://github.com/iamyunjuda
  • senyalog
    Senya의 개발 블로그
    senyalog
  • 전체
    오늘
    어제
    • 분류 전체보기 (77)
      • 일상 (6)
      • 알고리즘 이론 (14)
        • 백준 (8)
      • 개발 (47)
        • Server (7)
        • 인턴 (11)
        • Javascript (0)
      • 경제 (4)
  • 블로그 메뉴

    • Github
    • 홈
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    C++
    개발
    MSA
    알고리즘
    경제
    컴공
    공대생
    코딩테스트
    공부
    백준풀이
    코딩
    대학생인턴
    GIT
    인턴
    백준문제
    카페
    일상
    서버
    백엔드
    대학생
    백준
    인턴생활
    개발공부
    nestjs
    이마고웍스
    TypeScript
    알고리즘공부
    생각
    개발자
    깃
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
senyalog
[순열] 순열 구현하기 C++
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.