본문 바로가기
BOJ

[JAVA]백준 1043번 - 거짓말

by yujinkimkim 2023. 7. 20.

1043번: 거짓말 (acmicpc.net)

 

1043번: 거짓말

지민이는 파티에 가서 이야기 하는 것을 좋아한다. 파티에 갈 때마다, 지민이는 지민이가 가장 좋아하는 이야기를 한다. 지민이는 그 이야기를 말할 때, 있는 그대로 진실로 말하거나 엄청나게

www.acmicpc.net

package baekjoon;
import java.util.*;
import java.io.*;

public class b1043 {
	static int parent[];
	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		int n = Integer.parseInt(st.nextToken());
		parent = new int[n+1];
		int M = Integer.parseInt(st.nextToken()); 	
		
		List<Integer>[] p = new ArrayList[M+1];
		
		for (int i = 1; i <= M; i++) {
		    p[i] = new ArrayList<Integer>();
		}

		for(int i = 1 ; i <= n ; i++)
		{
			parent[i] = i;
		}
		
		boolean check[] = new boolean[n+1];
		st = new StringTokenizer(br.readLine());
		int temp = Integer.parseInt(st.nextToken());
		for(int i = 0 ; i < temp ; i++)
		{
			check[Integer.parseInt(st.nextToken())] = true;
		}
		
		
		for (int i = 1; i <= M; i++) { 

            String inputs[] = br.readLine().split(" ");
            int party_num = Integer.parseInt(inputs[0]);

            if(party_num<=1) {
                p[i].add(Integer.parseInt(inputs[1]));
                continue;
            }

            for (int j = 1; j < party_num; j++) { 
                int a = Integer.parseInt(inputs[j]);
                int b = Integer.parseInt(inputs[j+1]);
                if (Find(a) != Find(b)) {
                    Union(a,b);
                }

                p[i].add(a);
                p[i].add(b);
            }
        }

        boolean[] visited = new boolean[n + 1];
        for (int i = 1; i <= n; i++) {
            if(check[i] && visited[i] != true){
                int root = Find(i);
                for (int j = 1; j <= n; j++){
                    if (Find(j)==root) {
                        check[j] = true;
                        visited[j] = true;
                    }
                }
            }
        }
        
        int cnt = 0;
        for (int i = 1; i <= M; i++) { 
            boolean flag = false;
            for (int person : p[i]) { 
                if(check[person]){
                    flag = true;
                    break;
                }
            }
            if(!flag) cnt++;
        }
        bw.write(cnt+"");
        bw.close();
	}
	static public int Find(int a)
	{
		if (a == parent[a])
			return a;
		return parent[a] = Find(parent[a]);
	}

	public static void Union(int a, int b)
	{
		int pa = Find(a), pb = Find(b);
		parent[pa] = pb;
	}
}

솔직히 구글링 했는데요...

이해는 했는데 제 머리로는 조금 복잡하게...어렵게 느껴졌슴니다...

낼 일어나면 이거 코드 먼저 다시 공부하겠슴니다...

내 최애 포켓몬 ㅎㅎ

 

'BOJ' 카테고리의 다른 글

[python]백준 1238번 - 파티  (0) 2023.07.21
[JAVA] 백준 5107번 - 마니또  (2) 2023.07.20
[JAVA]백준 1092번 - 배  (0) 2023.07.18
[JAVA]백준 1068번 - 트리  (2) 2023.07.17
[JAVA]백준 1956번 - 운동  (2) 2023.07.16

댓글