Algorithm

[BOJ] 모든 순열 10974번 C++

따봉치치 2024. 6. 22. 16:58

 

문제

N이 주어졌을 때, 1부터 N까지의 수로 이루어진 순열을 사전순으로 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 N(1 ≤ N ≤ 8)이 주어진다. 

 

출력

첫째 줄부터 N!개의 줄에 걸쳐서 모든 순열을 사전순으로 출력한다.

 

접근 방식

 

모든 순열을 구하는 문제이기 때문에 처음에는 next_permutation으로 모든 순열을 구했다

그리고 백트래킹 문제인만큼! 백트래킹으로도 풀어보았다

백트래킹은 두가지 배열을 이용해서 풀었다

사용했는지 여부를 확인하는 배열과 현재 인덱스에 어떤 값이 들어가는지 저장할 배열을 사용했다

 

 

코드

 

1. next_permutation
#include<bits/stdc++.h>
using namespace std;

int N;
int main() {
    cin>>N;

    int arr[N];
    for(int i=1; i<=N; i++) arr[i-1] = i;

    do {
        for(int i=0; i<N; i++) cout<<arr[i]<<" ";
        cout<<'\n';
    }
    while(next_permutation(arr, arr+N));
}

 

 

2. 백트래킹
#include<bits/stdc++.h>
using namespace std;

int N;
int visited[9], num[9];

void sol(int cnt) {
    if(cnt == N) {
        for(int i=0; i<N; i++) cout<<num[i]<<" ";
        cout<<'\n';
        return;
    }
    for(int i=1; i<=N; i++) {
        if(!visited[i]) {
            visited[i] = true;
            num[cnt] = i;
            sol(cnt+1);
            visited[i] = false;
        }
    }
}
int main() {
    cin>>N;

    memset(visited, false, sizeof(visited));

    sol(0);
}

 

아래 - 1, 위 - 2로

둘다 시간은 똑같지만 next_permutation을 이용한풀이가 코드가 절반임을 알 수 있다 ~.~

공부하는 김에 백트래킹도 이용하면 좋지만 코테에서는 효율적으로 푸는 것이 좋을 듯하다