반응형
순열,, 재귀...,,
순열(Permutation) 이란? 서로 다른 물건들 중 몇 가지 대상을 뽑아 일렬로 나열하는 것
나는 순열을 어떻게 짜는지 몰랐다. 재귀로 짜는건가? 백트래킹으로 짜는건가? 많은 생각을 했지만 짜지 못했고
다른 사람의 소스코드를 봤다.... 아주 간단하더라.
풀이
1. 존재하는 수만큼 visited[] 배열을 만들어준다. 똑같은 값이 2번 들어가지 않게
2. 첫자리에 올 수를 반복문을 통해 하나씩 넣는다.
3. 두 번째 자리 부터 반복문을 다시 돌리는데 이미 사용한 숫자는 사용할 수 없도록 visited[] 배열을 통해 제한한다.
4. 재귀의 깊이가 갖고 있던 수만큼 들어갔을 때 출력하고 return하여 현재 순열에서 빠져 나온다.
5. 끝;; 내가 설명을 많이 못한거같은데 코드를 보면 이해 갈 수 있을 것이다.
소스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | import java.io.BufferedReader; import java.io.FileInputStream; import java.io.InputStreamReader; public class Main { static int[] output; public static void main(String args[]) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("input.txt"))); // BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int N = Integer.parseInt(br.readLine()); int[] arr = new int[N]; output = new int[N]; boolean[] visited = new boolean[N]; for (int i = 0; i < N; i++) { visited[i] = true; DFS(arr, visited, N, i, 0); visited[i] = false; } } public static void DFS(int[] arr, boolean[] visited, int N, int start, int depth) { output[depth] = start + 1; if (depth == N - 1) { 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]) continue; visited[i] = true; DFS(arr, visited, N, i, depth + 1); visited[i] = false; } } } | cs |
반응형
'나는요 공부가 좋....은걸... > 알고리즈음' 카테고리의 다른 글
[BOJ] 백준 1302 - 베스트셀러 (자바) (0) | 2018.02.20 |
---|---|
[BOJ] 백준 1461 - 도서관 (자바) (0) | 2018.02.20 |
[BOJ] 백준 2210 - 숫자판 점프 (자바) (0) | 2018.02.20 |
[BOJ] 백준 1049 - 기타줄 (자바) (0) | 2018.02.20 |
[BOJ] 백준 2156 - 포도주 시식 (자바) (0) | 2018.02.20 |