[boj][c++] 10972 다음순열, 10973 이전순열, 10974 모든순열

ppparkta·2022년 9월 26일
1

Problem solving

목록 보기
40/65

10972 다음 순열

🎈 순열

임의의 수열을 다른 순서로 섞는 연산
A=[1,5] 인 경우 [1,5],[5,1] 이 순열이다.

c++의 algorithm 헤더에는 next_permutation과 prev_permutation이 있어서 문제를 쉽게 풀 수 있었다.

🎗 Permutation 사용법

반환형 : <bool> 타입. 다음 (혹은 이전) 순열을 찾는데 성공하면 <true return>, 실패하면 <false return>
사용법 : <bool check = next_permutation (순열의 시작 위치, 순열의  위치)>
#include	<iostream>
#include	<algorithm>
using namespace std;
int n;
int arr[10001];
bool check;
int main()
{
	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> arr[i];
	check = next_permutation(arr, arr + n);
	if (check == false)
	{
		cout << -1 << endl;
		return 0;
	}
	for (int i = 0; i < n; i++)
	{
		cout << arr[i] << " ";
	}
	return 0;
}

10973 다음 순열

#include	<iostream>
#include	<algorithm>
using namespace std;
int n;
int arr[10001];
bool check;
int main()
{
	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> arr[i];
	check = prev_permutation(arr, arr + n);
	if (check == false)
	{
		cout << -1 << endl;
		return 0;
	}
	for (int i = 0; i < n; i++)
	{
		cout << arr[i] << " ";
	}
	return 0;
}

10974 모든 순열


앞에서 익힌 next_permutation() 을 사용해서 반복문을 돌리면 해결할 수 있다.

#include	<iostream>
#include	<algorithm>
using namespace std;

int n;
bool check;
int arr[9];

int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++)
		arr[i - 1] = i;
	for (int i = 0; i < n; i++)
	{
		cout << arr[i] << " ";
	}
	cout << '\n';
	while (next_permutation(arr, arr + n))
	{
		for (int i = 0; i < n; i++)
		{
			cout << arr[i] << " ";
		}
		cout << '\n';
	}
	return 0;
}
profile
겉촉속촉

0개의 댓글