본문 바로가기
Problem Solving/백준

[백준] 10972번 : 다음 순열

by shinbian11 2020. 7. 16.

https://www.acmicpc.net/problem/10972

 

10972번: 다음 순열

첫째 줄에 입력으로 주어진 순열의 다음에 오는 순열을 출력한다. 만약, 사전순으로 마지막에 오는 순열인 경우에는 -1을 출력한다.

www.acmicpc.net


//C++
#include <bits/stdc++.h>
#define F_I ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);

typedef long long ll;
using namespace std;

int main()
{
	F_I;
	int n;
	cin >> n;
	vector<int> v(n);


	for (int i = 0; i < n; i++) //순열 입력 받기
		cin >> v[i];

	//입력받은 순열이 가장 마지막 순열이라면, -1 출력
	//가장 마지막 순열은.. 모든 원소들이 내림차순이다. (맨 앞의 원소가 제일 크고, 점점 작아진다. 예를 들면, 4 3 2 1)
	bool flag = true;

	for (int i = 0; i < n-1; i++)
	{
		if (v[i] < v[i + 1])
			flag = false;
	}
	if (flag == true) //사전순으로 가장 마지막 순열이라면
	{
		cout << -1 << '\n';
		return 0;
	}

	while (next_permutation(v.begin(), v.end()))
	{
		for (int i = 0; i < n; i++)
			cout << v[i] << ' ';
		cout << '\n';
		return 0; //다음 순열 하나만 출력하고 프로그램 끝내야 하니까, 하나만 출력하고 바로 return 0; 하기!
	}
}

 

> 입력받은 순열이 가장 마지막 수열이라면 -1을 출력해야 하는데,

가장 마지막 순열은 순열의 맨 앞의 원소가 제일 크고, 점점 작아져야 한다는 규칙이 있다. (예를 들면 4 3 2 1 이 있다)

 

> C++은 next_permutation이라는 stl이 만들어져 있으므로, 순열 관련 문제는 좀 더 편하게 풀 수 있다.

next_permutation의 매개변수에는 구하고자 하는 순열의 시작과 끝을 넣어주면 된다.

 

> 다음 순열들을 모두 출력하는 문제가 아니라, 1개만 출력하는 문제이므로, 

for문을 통해 다음 순열을 한개만 출력한 이후에 return 0; 을 통해 프로그램을 종료한다.