알고리즘/문제풀이 :백준
[백준][C++] 10972 - 다음 순열 (next_permutation)
각쿄
2025. 5. 4. 15:50
📌문제 설명
https://www.acmicpc.net/problem/10972
💡생각
- DFS를 이용해서 순열을 계속 구한다.
- 입력받은 순열과 같은 순열을 만난다면 값을 true로 바꾼다.
- 이후 나오는 순열을 출력한다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <stack>
using namespace std;
vector<int> v;
vector<int> save;
bool flag = false;
bool answer = false;
bool isAnswer(){
if(v == save){
return true;
}
return false;
}
void dfs(bool * visited, int N){
if(v.size() == N){
if(!flag){
if(isAnswer()){
flag = true;
}
}else{
for(int a : v){
cout << a << " ";
}
answer = true;
return;
}
}
else{
for(int i = 1; i <= N; i++){
if(answer) return;
if(!visited[i])
{
visited[i] = true;
v.push_back(i);
dfs(visited, N);
visited[i] = false;
v.pop_back();
}
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int N;
int temp = 0;
cin >> N;
bool visited[N + 1];
for(int i = 1; i <= N; i++){
visited[i] = false;
}
for(int i = 1; i <= N; i++){
cin >> temp;
save.push_back(temp);
}
dfs(visited, N);
if(!answer){
cout << -1;
}
}
재귀로 구현을 하니까 시간초과가 바로 발생해버렸다.
비교하는 과정이 너무 많아서 그럴 수 있을 거 같다. 그리고 정답을 출력한 이후에도 실행된 모든 재귀함수를 종료하기 위해서 return을 반복하기 때문에 시간 초과가 발생한 거 같다.
🔥풀이
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int N;
cin >> N;
vector<int> v(N);
for(int i = 0; i < N; i++){
cin >> v[i];
}
if(next_permutation(v.begin(), v.end())){
for(int i : v) cout << i << " ";
}else{
cout << -1;
}
return 0;
}
next_permutation이라는게 존재하는지 처음 알았다..
next_permutation
- 다음 순열이 존재한다면 true
- 다음 순열이 존재하지 않다면 false
- 정렬된 상태일 때 모든 순열을 탐색하는게 가능하다.