순열이란 순서가 정해진 임의의 집합을 다른 순서로 섞는 연산을 말한다.
nPr = n! / (n-r)!
n 은 총 개수
r 은 고르려는 개수
📝1,2,3 이 있다고 한다면, 1, 3, 2 이런식으로 다른 순서로 섞는 연산을 말한다.
📝n 개의 집합 중 n 개를 고르는 순열의 개수는 n! 이라는 특징을 가지고 있다.
💡문제
예를 들어 3개 중 3개를 뽑는다면 3! / (3-3)! 이 된다.
📝해설
3P3 = 3! / (3-3)!
💡문제
3개 중 1개를 뽑는다면 3! / (3-1)! 이 되는 것이다.
📝해설
3P1 = 3! / (3-1)!
💡문제
서로 다른 색깔을 가진 3개의 공에 대해 3개를 "!!!순서와 상관 있이!!!" 뽑는 경우의 수는 어떻게 될까?
📝해설
3P3 = 3! / (3-3)!
6 / 0! -> 참고로 0! 은 1 이다.
📝결과
6
순열에 두가지가 있다.
next_permutation -> 오름차순의 배열 기반으로 순열을 만들 수 있다.
prev_permutation -> 내림차순의 배열 기반으로 순열을 만들 수 있다.
매개변수로는 순열을 만들 범위를 가르키는 first, last 을 넣는다.
순열을 시작할 범위의 첫번째 주소, 그리고 포함되지 않는 마지막 주소를 넣어 만든다.
한가지만 알아도 되니, next_permutaion 으로 문제르 풀자!
#include <cstdio>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
vector<int> v;
void printV(vector<int> &v) {
for(int i = 0; i < v.size(); i++ ){
cout << v[i] << " ";
}
cout << "\n";
}
int main() {
for(int i = 1; i <= 3; i ++)v.push_back(i);
do
{
printV(v);
} while (next_permutation(v.begin(), v.end()));
return 0;
}
/*
결과 )
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
*/
응 가능!
여기서 배열의 종점인 end() 를 넣지않고 다른걸 넣을 수 있다.
배열의 0, 1 만의 순서만 고치게도 가능하다
// v.begin(), v.begin() +2 만의 범위를 만든것이다.
do{
printV(v);
}while(next_permutation(v.begin(), v.begin() + 2));
/*
결과 )
123
213
*/
.
vector<타입> 변수명;
무엇이있는지와 C++ 코드에 적힌 함수만 설명하고, 자세한건 알고리즘 이론에 작성하겠다.
vector 의 뒤에서부터 요소를 더한다. 참고로 emplace_back() 과 같은 기능이다.
push_back(), pop_back(), erase(), find(from, to, value), clear(), fill(from, to, value) 등이 있다.
문자열의 첫번째 요소
문자열의 마지막 요소 그다음을 가르키는 이터레이터를 반환한다. 자료 구조인 vector, Array, 연결리스트, Map, Set 에서도 같은 의미이다.