백준 10972, 10973, 10974

순열 문제는 기본적으로 C++ STL의 next_permutation()과 prev_permutation()을 이용하는데, 다음의 세 문제는 문제를 푼다기보단 next_permutation(), prev_permutation()을 이용해서 출력하는 문제와 같다.

next_permutation()의 사용법을 간단히 설명해보면,
먼저 int형 vector배열 a를 선언한다.

vector<int> a(n);

a에 초기 수열을 넣는다. 예시에선 1 2 3 4를 넣는다.
다음과 같은 표가 나온다.

  a[0] a[1] a[2] a[3]
a[i] 1 2 3 4

next_permutation을 실행한다.

next_permutation(a.begin(), a.end())

다음과 같은 표가 나온다.

  a[0] a[1] a[2] a[3]
a[i] 1 2 4 3

이런식으로 마지막에 4 3 2 1이 될 때까지 실행한다.
다음 수열이 없을 때엔 false를 반환한다.
prev_permutation은 그 반대로 생각하면 된다.

10972 소스

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	cin >> n;
	vector<int> a(n);
	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}
	if (next_permutation(a.begin(), a.end())) {
		for (int i = 0; i < n; i++) {
			cout << a[i] << ' ';
		}
	}
	else {
		cout << "-1";
	}
	cout << '\n';

}

10973 소스

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	cin >> n;
	vector<int> a(n);
	for (int i = 0; i < n; i++) {
		a[i] = i + 1;
	}
	do{
		for (int i = 0; i < n; i++) {
			cout << a[i] << ' ';
		}
		cout << '\n';
	} while (next_permutation(a.begin(), a.end()));

}

10974 소스

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	cin >> n;
	vector<int> a(n);
	for (int i = 0; i < n; i++) {
		a[i] = i + 1;
	}
	do{
		for (int i = 0; i < n; i++) {
			cout << a[i] << ' ';
		}
		cout << '\n';
	} while (next_permutation(a.begin(), a.end()));

}

댓글남기기