티스토리 뷰

출저 : 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] == 0continue;
            
            // 지금까지 선택된 모든 친구들과 i가 친구인지 판별하여
            int j;
            for (j = 0; j < index; j++) {
                if(adj[i][result[j]] == 0break
            }
            // 전부 친구가 아니라면 패스
            if(j == index) continue;
            
            result[index] = i;
            solve(index+1,i);
            if(find) return ;
        }
    }
}
 
cs




댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday