티스토리 뷰
출저 : https://www.acmicpc.net/problem/2026
"DFS 문제를 잘 읽어야함..."
문제를 잘 안 읽어서 계속 틀렸음. 문제를 잘 읽어 보면 선택된 K명의 모든 애들이 다 친구여야 함.
최초에 1-3-2-4 의 관계가 되면 나는 1,2,3,4 모두 답으로 출력했음. 이거 빼고는 그냥 DFS 문제.
따라서 아래 68~ 73 라인을 추가했음.
팁으로 경로를 찍을 때는 list 보다는 아래와 같이 result 배열 하나만을 생성해 이를 이용해 경로를 찍는 것이 더 좋다고 생각됨.
또 하나, 전부 친구인지 아닌지 판별하는 부분에서 boolean 변수를 사용할 수도 있지만 이미 생성된 j를 가지고 끝까지 돌았는지 j == index 인지 판별하면 변수 생성을 하나 줄일수 있으미..
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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; class Main { static int K,N,F; static int[][] adj; static int[] result; static boolean find; static StringBuilder sb = new StringBuilder(); public static void main (String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); K = Integer.parseInt(st.nextToken()); N = Integer.parseInt(st.nextToken()); F = Integer.parseInt(st.nextToken()); result = new int[K]; adj = new int[N+1][N+1]; for (int i = 0; i < F; i++) { st = new StringTokenizer(br.readLine()); int a = Integer.parseInt(st.nextToken()); int b = Integer.parseInt(st.nextToken()); // a와 b가 친구라면 b와 a도 친구 adj[a][b] = adj[b][a] = 1; } for (int i = 1; i <= N; i++) { result[0] = i; solve(1,i); // 다 찾았다면 종료 if(find) break; } // 가능한 결과를 찾은 경우에만, if(find){ for (int i = 0; i < K; i++) { sb.append(result[i]+"\n"); } System.out.print(sb.toString()); } else { System.out.println(-1); } } static void solve(int index, int cur) { // 결과 찾으면 탐색 x if(find) return; // 마지막 K번째까지 다 돌한 경우 종료. if(index == K) { find = true; return ; } for (int i = cur+1; i <= N; i++) { // 애초에 cur과 i가 친구가 아니면 패스 if(adj[cur][i] == 0) continue; // 지금까지 선택된 모든 친구들과 i가 친구인지 판별하여 int j; for (j = 0; j < index; j++) { if(adj[i][result[j]] == 0) break; } // 전부 친구가 아니라면 패스 if(j == index) continue; result[index] = i; solve(index+1,i); if(find) return ; } } } | cs |
'Study > 알고리즘 문제풀이' 카테고리의 다른 글
SWEA 1808. 지희의 고장난 계산기 :: 돼지개발자 (1) | 2019.02.12 |
---|---|
SWEA 4050. 재관이의 대량 할인 :: 돼지개발자 (0) | 2019.02.10 |
백준 1389. 케빈 베이컨의 6단계 법칙 :: 돼지개발자 (0) | 2019.02.07 |
백준 2583. 영역 구하기 :: 돼지개발자 (0) | 2019.02.07 |
백준 2234. 성곽 :: 돼지개발자 (0) | 2019.02.07 |
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday