코테/백준

[백준/JAVA] 9466번: 텀 프로젝트

imname1am 2023. 9. 3. 23:58
반응형

🔺 문제

 

9466번: 텀 프로젝트

이번 가을학기에 '문제 해결' 강의를 신청한 학생들은 텀 프로젝트를 수행해야 한다. 프로젝트 팀원 수에는 제한이 없다. 심지어 모든 학생들이 동일한 팀의 팀원인 경우와 같이 한 팀만 있을

www.acmicpc.net

 

 

🔺 코드

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
import java.util.*;
import java.io.*;
 
public class Main {
    
    static int[] arr;
    static boolean[] visited, done; // 방문, 팀 편성 완료 배열
    
    static int cnt;
    static StringBuilder sb = new StringBuilder();
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        
        int T = Integer.parseInt(br.readLine());
        while(T --> 0) {
            int N = Integer.parseInt(br.readLine());
            
            arr = new int[N + 1];
            visited = new boolean[N + 1];
            done = new boolean[N + 1];
            cnt = 0;
            
            st = new StringTokenizer(br.readLine(), " ");
            for(int i = 1 ; i <= N ; i++) {
                int num = Integer.parseInt(st.nextToken());
                arr[i] = num;
            }
            
            for(int i = 1 ; i <= N ; i++) {
                if(!done[i]) {
                    dfs(i);
                }
            }
            
            sb.append(N - cnt).append("\n");
        }
        
        System.out.println(sb);
        
    }
    
    private static void dfs(int num) {
        if(visited[num]) { // 이미 방문한 경우
            done[num] = true// 팀 편성 완료 처리
            cnt++;            // 팀 편성 완료 인원 증가
        }
        else {
            visited[num] = true;
        }
        
        // 다음 학생이 팀 결성을 아직 못 했을 경우
        if(!done[arr[num]]) {
            dfs(arr[num]);
        }
        
        visited[num] = false; // 학생 방문 체크 초기화
        done[num] = true; // 모든 작업이 끝나서 더 이상 사용하지 않음 (사이클이 아닌 애들 위해 여기에 작성)
    }
}
cs
✅ 해결 아이디어
✔ DFS
- 사이클을 만들지 못 하는 노드 개수 찾기

🧩 필요한 자료구조

- visited[] : 방문 여부 체크용 배열 배열

- done[]    : 팀 완성 배열

 

 

💥 유의사항

• 모든 점에 대해 DFS 수행 시, 시간 복잡도가 O(n^2)이 되어 시간 초과

 

 


💬 느낀 점

유니온파인드로도 풀 수 있지 않을까? 생각했는데

이미 그렇게 풀어본 분이 계시고, 시간초과가 발생한다고 한다. (참고)

 

복습을 잘해야겄다,,,

 

1회독 2회독 3회독 4회독 5회독
V        

(참고)

✔ 친절한 해설과 주석.. 감사합니다...

 

백준 9466번. 텀 프로젝트 (Java)

문제 링크 : https://www.acmicpc.net/problem/9466 싸이클을 형성하지 못하는 노드 갯수를 찾는 문제입니다. 일반적인 DFS로 모든 노드를 탐색하면 시간 초과가 납니다. 테스트케이스가 2 3 4 5 1 이렇게 주어

bcp0109.tistory.com

 

백준 9466번 : 텀 프로젝트 (JAVA) 문제 풀이

https://www.acmicpc.net/problem/9466 9466번: 텀 프로젝트 이번 가을학기에 '문제 해결' 강의를 신청한 학생들은 텀 프로젝트를 수행해야 한다. 프로젝트 팀원 수에는 제한이 없다. 심지어 모든 학생들이

iseunghan.tistory.com

 

 

[BOJ] 백준 9466번 텀 프로젝트 (Java)

#9466 텀 프로젝트 난이도 : 골드 4 유형 : DP 9466번: 텀 프로젝트 이번 가을학기에 '문제 해결' 강의를 신청한 학생들은 텀 프로젝트를 수행해야 한다. 프로젝트 팀원 수에는 제한이 없다. 심지어 모

loosie.tistory.com

 

- 복습용

 

[백준] 9466번 텀 프로젝트 (JAVA)

9466번: 텀 프로젝트 이번 가을학기에 '문제 해결' 강의를 신청한 학생들은 텀 프로젝트를 수행해야 한다. 프로젝트 팀원 수에는 제한이 없다. 심지어 모든 학생들이 동일한 팀의 팀원인 경우와

yeeybook.tistory.com

 

반응형