본문 바로가기
알고리즘 문제풀이/백준

[백준 9466] 텀 프로젝트(JAVA/C++)

by 소보루:-) 2020. 3. 25.

https://www.acmicpc.net/problem/9466

 

9466번: 텀 프로젝트

문제 이번 가을학기에 '문제 해결' 강의를 신청한 학생들은 텀 프로젝트를 수행해야 한다. 프로젝트 팀원 수에는 제한이 없다. 심지어 모든 학생들이 동일한 팀의 팀원인 경우와 같이 한 팀만 있을 수도 있다. 프로젝트 팀을 구성하기 위해, 모든 학생들은 프로젝트를 함께하고 싶은 학생을 선택해야 한다. (단, 단 한 명만 선택할 수 있다.) 혼자 하고 싶어하는 학생은 자기 자신을 선택하는 것도 가능하다. 학생들이(s1, s2, ..., sr)이라 할 때, r=

www.acmicpc.net

 

 

 

 

[JAVA]

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main{

	static int N, ans;
	static int[] want;
	static boolean[] chk;
	static boolean[] done;
	
	public static void main(String[] args)throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		int T=Integer.parseInt(br.readLine());
		for(int tc=1; tc<=T; tc++) {
			N=Integer.parseInt(br.readLine());
			ans=N;
			want=new int[N+1];//1부터 시작
			chk=new boolean[N+1];
			done=new boolean[N+1];
			st=new StringTokenizer(br.readLine()," ");
			for(int i=1; i<=N; i++) {
				want[i]=Integer.parseInt(st.nextToken());
			}
			for(int i=1; i<=N; i++) {
				if(chk[i]==false) {
					chk[i]=true;
					dfs(i);
				}
				
			}
			
			System.out.println(ans);
		}
	}

	private static void dfs(int num) {
		int next=want[num];
		if(chk[next]==false) {
			chk[next]=true;
			dfs(next);
		}
		if(done[next]==false) {
			ans--;
			for(int i=next; i!=num; i=want[i])
				ans--;
		}
	
		done[num]=true;
	}

}

 

 

 

[C++]

#include <iostream>
#include <cstring>
#define MAX 100001
using namespace std;

int N, cnt;
int want[MAX];
bool visited[MAX];
bool done[MAX];

void Dfs(int node) {
	visited[node] = true;
	int next = want[node];
	if (!visited[next]) {
		Dfs(next);
	}
	if (!done[next]) {
		cnt++;
		for (int i = next; i != node; i = want[i]) {
			cnt++;
		}

	}
	done[node] = true;
}
int main() {
	int T;
	cin >> T;
	for (int tc = 0; tc < T; tc++) {
		memset(visited, 0, sizeof(visited));
		memset(done, 0, sizeof(done));
		cnt = 0;
		cin >> N;
		for (int i = 1; i <= N; i++) {
			cin >> want[i];
		}
		for (int i = 1; i <= N; i++) {
			if (!visited[i]) {
				Dfs(i);
			}
		}
		
		cout << N-cnt <<"\n";
	}
	return 0;
}

댓글