-
[Baekjoon Online Judge] 10974번: 모든 순열문제 풀이/Baekjoon Online Judge 2021. 4. 21. 19:34
요구사항
- N이 주어졌을 때, 1부터 N까지의 수로 이루어진 순열을 사전순으로 출력하는 프로그램을 작성하시오.
입력
- 첫째 줄에 N(1 ≤ N ≤ 8)이 주어진다.
출력
- 첫째 줄부터 N!개의 줄에 걸쳐서 모든 순열을 사전순으로 출력한다.
DFS를 활용하여 풀이하였다. 순열을 사전순으로 출력해야 하기 때문에 입력이 3인 경우 첫 자리는 1, 2, 3이 올 수 있다. DFS를 활용하여 depth를 높여가며 output을 하나씩 방문해준다. 만약 depth의 깊이가 3과 같아지면 3개의 항목을 채웠다고 가정하고 즉시 출력해준다.
그 다음 방문기록을 false로 설정하고 다음 숫자를 깊이 있게 탐색을 진행한다.
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; public class Baekjoon10974 { static int[] output; static int n; static boolean[] visited; public static void main(String[] args) throws IOException { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(System.out)); n = Integer.valueOf(bufferedReader.readLine()); int[] array = new int[n]; output = new int[n]; visited = new boolean[n]; dfs(0); bufferedWriter.flush(); bufferedReader.close(); bufferedWriter.close(); } private static void dfs(int depth) { if (depth == n) { for (int i = 0; i < n; i++) { System.out.print(output[i] + " "); } System.out.println(); return; } for (int i = 0; i < n; i++) { if (!visited[i]) { visited[i] = true; output[depth] = i + 1; dfs(depth + 1); visited[i] = false; } } } }
'문제 풀이 > Baekjoon Online Judge' 카테고리의 다른 글
[Baekjoon Online Judge] 5430번: AC (0) 2021.07.18 [Baekjoon Online Judge] 17219번: 비밀번호 찾기 (0) 2021.04.21 [Baekjoon Online Judge] 10546번: 배부른 마라토너 (0) 2021.04.04 [Baekjoon Online Judge] 5397번: 키로거 (0) 2021.04.04 [Baekjoon Online Judge] 10845번: 큐 (0) 2021.04.04