반응형
https://www.acmicpc.net/problem/10974
문제
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
반응형
'알고리즘 > PS - 백준' 카테고리의 다른 글
[백준 3085 - C++] 사탕 게임 : 브루트포스 (0) | 2021.05.27 |
---|---|
[백준 1182 - C++] 부분 수열의 합 : 브루트포스 (0) | 2021.05.27 |
[백준 2352 - C++] 반도체 설계 : 이분 탐색 (0) | 2021.05.23 |
[백준 2776 - C++] 암기왕 : 이분 탐색 (0) | 2021.05.20 |
[백준 2805 - C++] 나무 자르기 : 이분 탐색 (0) | 2021.05.20 |