[Java] BOJ1043, 백준 - 거짓말

2022. 2. 25. 18:14·알고리즘/문제풀이
728x90

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

 

1043번: 거짓말

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

www.acmicpc.net

 

유니온파인드 응용 문제이다.
boolean[] know 배열을 이용하여 진실을 아는 그룹을 체크해주면 된다.
유니온파인드 기초만 탄탄하다면 응용하기 어렵지 않은 문제

<문제풀이>

import java.io.*;
import java.util.*;

public class Main {

	private static int[] parent;
	private static boolean[] know;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());

		int n = parse(st.nextToken()); // 사람 수
		int m = parse(st.nextToken()); // 파티 수
		st = new StringTokenizer(br.readLine());
		int p = parse(st.nextToken()); // 진실을 아는 사람 수
		know = new boolean[n + 1]; // 진실을 알고있는 사람의 정보
		for (int i = 0; i < p; i++)
			know[parse(st.nextToken())] = true;
		int[] party = new int[m]; // 파티의 루트

		makeSet(n);

		for (int i = 0; i < m; i++) { // 파티 개수
			st = new StringTokenizer(br.readLine());

			p = parse(st.nextToken()); // 파티에 오는 사람 수
			int a = parse(st.nextToken()); // 첫 번째 사람
			party[i] = a;
			for (int j = 0; j < p - 1; j++) // 같은 파티 사람들은 모두 한 그룹에 넣자
				union(a, parse(st.nextToken()));
		}

		int cnt = 0;
		for (int i = 0; i < m; i++) {
			if (!know[find(party[i])])
				cnt++;
		}
		System.out.println(cnt);
	}

	private static void makeSet(int n) {
		parent = new int[n + 1];
		for (int i = 1; i <= n; i++)
			parent[i] = i;
	}

	private static int find(int a) {
		if (a == parent[a])
			return a;
		else
			return parent[a] = find(parent[a]);
	}

	private static void union(int a, int b) {
		int ra = find(a);
		int rb = find(b);
		if (ra != rb) {
			if (know[ra] || know[rb]) {
				// 둘 중 한 그룹이라도 진실을 알고있다면
				know[rb] = true;
				know[ra] = true;
			}
			parent[rb] = ra;
		}
	}

	private static int parse(String s) {
		return Integer.parseInt(s);
	}
}
저작자표시 (새창열림)

'알고리즘 > 문제풀이' 카테고리의 다른 글

[Java] BOJ20364, 백준 - 부동산 다툼  (0) 2022.03.09
[Java] BOJ16562, 백준 - 친구비  (0) 2022.02.25
[Java] BOJ16236, 백준 - 아기 상어  (0) 2022.02.25
[Java] BOJ16954, 백준 - 움직이는 미로 탈출  (0) 2022.02.25
[Java] BOJ15683, 백준 - 감시  (0) 2022.02.18
'알고리즘/문제풀이' 카테고리의 다른 글
  • [Java] BOJ20364, 백준 - 부동산 다툼
  • [Java] BOJ16562, 백준 - 친구비
  • [Java] BOJ16236, 백준 - 아기 상어
  • [Java] BOJ16954, 백준 - 움직이는 미로 탈출
kkap999
kkap999
IT에 관심 가득한 갑갑이의 개발&스터디 블로그
  • kkap999
    갑갑이의 개발세상
    kkap999
    • 분류 전체보기 (95)
      • Backend (1)
        • Java&Spring&Servlet (8)
        • DB (0)
      • 알고리즘 (78)
        • 문제풀이 (70)
        • 자료구조 (6)
        • 그 외 (2)
      • App&FE (3)
        • FE (1)
        • Flutter (2)
      • Computer Science (0)
        • 네트워크 (0)
        • 컴퓨터기초 (0)
      • Cloud (0)
        • AWS (0)
        • Azure (0)
        • gcp (0)
      • 잡담&일상 (4)
        • 일상 (1)
        • 잡담 (2)
        • 음악 (1)
  • 태그

    알고리즘
    BOJ
    BOJ15649
    백준
    N과M(1)
  • 링크

    • github
  • 인기 글

  • 최근 글

  • 05-15 09:44
  • 전체
    오늘
    어제
  • 반응형
  • hELLO· Designed By정상우.v4.10.3
kkap999
[Java] BOJ1043, 백준 - 거짓말
상단으로

티스토리툴바