알고리즘/PS - 백준

[백준 10974 - C++] 모든 순열 : 브루트포스

excited-hyun 2021. 5. 27. 22:42
반응형

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

 

10974번: 모든 순열

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

www.acmicpc.net

문제

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

입력

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

출력

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

예제 입력 1

3

예제 출력 1

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

풀이

이 문제에선 N이 작기 때문에 시간복잡도는 크게 고민하지 않아도 괜찮다.
DFS와 비슷한 느낌으로 재귀를 이용해서 구현하였다.
printing 배열로 이미 같은 줄에 추가 된지 확인하고 그렇지 않은 경우만 arr[cnt]에 추가한다.
여기서 중요한건 재귀를 끝내고 돌아오면 printing을 0으로 만들고 cnt도 1 줄여주어야 한다는 것!

#include <iostream>
#include <cstdio>

int printed[10];
int arr[10];

void printing(int n, int cnt){
    if(n==cnt){
        for(int i=0; i<n; i++)
            printf("%d ", arr[i]);
        printf("\n");
        return ;
    }
    for(int i=1; i<=n; i++){
        if(printed[i] == 1)
            continue;
        arr[cnt] = i;
        printed[i] = 1;
        cnt++;
        printing(n, cnt);
        printed[i] = 0;
        cnt--;
    }
}

int main (void){
    int n;
    scanf("%d", &n);
    
    for(int i=1; i<=n; i++){
        arr[0]=i;
        printed[i] = 1;
        printing(n, 1);
        printed[i] = 0;
        
    }
}

728x90
반응형