https://www.acmicpc.net/problem/10972
//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; 을 통해 프로그램을 종료한다.
'Problem Solving > 백준' 카테고리의 다른 글
[백준] 11052번 : 카드 구매하기 (0) | 2020.08.10 |
---|---|
[백준] 16929번 : Two Dots (0) | 2020.08.04 |
[백준] 15650번 : N과 M (2) (0) | 2020.07.15 |
[백준 ] 1748번 : 수 이어 쓰기 1 (0) | 2020.07.14 |
[백준] 17363번 : 우유가 넘어지면? (0) | 2020.07.13 |