티스토리 뷰
출저 : https://www.acmicpc.net/problem/6603
"재귀 함수를 활용한 DFS 완전탐색"
해당 문제의 분류는 BFS로 되어있었는데, 흠... DFS가 훨씬 풀기 쉬운 것 같다.
먼저 주어진 숫자 k 중에서 6개를 뽑는 경우의 수를 사전순으로 출력하는 것이다. 따라서 완전 탐색을 해주면 되겠다.
여기서 한가지 팁은 k 가 8일 때 가장 앞에 올 수 있는 배열의 index는 무엇일까... 당연히 0,1,2 가 되겠다. 따라서 dfs 시작 for문에서
[0,k-8) 까지만 검색 하면되겠다... 백트래킹 과정에서 어랏... 앞에 지나온 집합 원소들이 찍히질 않아서 당황했지만,
for문을 돌아 방문한 배열들을 다시 탐색해 그냥 찍어주었따.
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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; class Main { static int k; static int[] list; static boolean[] visited; static StringBuffer sb = new StringBuffer(); public static void main (String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while(true) { StringTokenizer st = new StringTokenizer(br.readLine()); k = Integer.parseInt(st.nextToken()); if(k == 0) break; list = new int[k]; visited = new boolean[k]; for (int i = 0; i < k; i++) { list[i] = Integer.parseInt(st.nextToken()); } for (int i = 0; i <= k-6; i++) { visited[i] = true; solve(i,1); visited[i] = false; } sb.append("\n"); } System.out.print(sb.toString()); } static void solve(int cur, int cnt) { if(cnt == 6) { for (int i = 0; i < k; i++) { if(visited[i]) sb.append(list[i]+" "); } sb.append("\n"); return; } for (int i = cur; i < k; i++) { if(visited[i]) continue; visited[i] = true; solve(i, cnt+1); visited[i] = false; } } } | cs |
'Study > 알고리즘 문제풀이' 카테고리의 다른 글
백준 4179. 불! :: 돼지개발자 (0) | 2018.12.03 |
---|---|
백준 2667. 단지번호붙이기 :: 돼지개발자 (0) | 2018.12.03 |
백준 11559. Puyo Puyo :: 돼지개발자 (0) | 2018.12.02 |
백준 2146. 다리 만들기 :: 돼지개발자 (0) | 2018.11.27 |
백준 1600. 말이 되고픈 원숭이 :: 돼지개발자 (0) | 2018.11.27 |
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday