둠치킨
코딩하는 둠치킨
둠치킨

블로그 메뉴

  • 홈
  • 분류 전체보기 (218) N
    • BOJ (171) N
      • 스택 (14)
      • 큐 (5)
      • 덱 (4)
      • 그래프 (30)
      • 배열 (8)
      • 재귀 (12)
      • 브루트 포스 (2)
      • 그리디 알고리즘 (7)
      • 다이내믹 프로그래밍 (13)
      • 백트래킹 (24)
      • 기하학 (4)
      • 트리 (4)
      • 구현 (14)
      • 수학 (3)
      • 맵 (1)
      • 다익스트라 (2)
      • 누적합 (5) N
    • 자료구조 (14)
      • 스택 (3)
      • 큐 (5)
      • 덱 (2)
      • 그래프 (1)
      • 트리 (1)
      • 힙 (1)
      • 정렬 (1)
    • C++ (11)
      • 모두의코드 (2)
      • Effective C++ (3)
      • C++ STL (6)
    • 컴파일러 (1)
    • OS (17)
    • 컴퓨터 구조 (2)
    • Unreal Engine 5 (2)

공지사항

전체 방문자
오늘
어제

인기 글

최근 글

태그

  • BFS
  • boj
  • Bruteforce
  • C
  • C++
  • C++ STL
  • Cache Memory
  • deadlock
  • DFS
  • Effective C++
  • java
  • Mutex
  • next_permutation
  • os
  • Process
  • rotate
  • semaphore
  • spin lock
  • STL
  • STL C++
hELLO · Designed By 정상우.
둠치킨

코딩하는 둠치킨

BOJ/그래프

1043번: 거짓말 (BOJ JAVA)

2023. 3. 22. 00:47

1043번: 거짓말

사용 언어: JAVA

 

풀이

파티에서 진실을 아는 사람을 좀비라 생각하고, 좀비와 같은 파티에 간 사람은 감염된다고 생각했다. 이 문제에 다시 와서 parent 함수, find-union으로 더 간단한 풀이를 만들어야겠다.

//진실을 아는 사람(좀비)과 같은 파티에 있던 사람은 감염된다.

import java.util.Scanner;

public class Main{
    
    static int[][] party;
    static int[] arr;
    static int[] arr2;
    
    public static void check_infect(int N, int M){ //N: how many people, M: party
        for(int i=0; i<M; i++){
            for(int j=0; j<arr2[i]; j++){
                if(arr[party[i][j]] == 1){
                    for(int k=0; k<arr2[i]; k++){
                        arr[party[i][k]] = 1;
                    }
                    break;
                }
            }
        }
    }

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int N = scan.nextInt(); //N = Number of People
		int M = scan.nextInt(); //M = Number of Party
		int ans = M;
        boolean isZombie_flag = false;
		arr = new int[N+1]; //is person infected
        party = new int[M][N+1]; //who is at each party
        arr2 = new int[M]; //how many people at each party
		int HowManyKnowTruth = scan.nextInt();

		for(int i=0; i<HowManyKnowTruth; i++) {
			int NumberWhoKnowTruth = scan.nextInt();
			arr[NumberWhoKnowTruth] = 1;
		}
		for(int i=0; i<M; i++) {
            isZombie_flag = false; 
			int HowManyAtParty = scan.nextInt();
            arr2[i] = HowManyAtParty;
            int[] temparr = new int[HowManyAtParty];
			for(int j=0; j<HowManyAtParty; j++) {
				int WhoIsAtParty = scan.nextInt();
                temparr[j] = WhoIsAtParty;
                party[i][j] = WhoIsAtParty;
				if(arr[WhoIsAtParty] == 1) { //좀비가 존재
                    isZombie_flag = true;
				}
			}
            
            if(isZombie_flag == true){
                for(int j=0; j<HowManyAtParty; j++){
                    arr[temparr[j]] = 1; //좀비가 같은 파티에 있던 사람 감염을 함
                }
            }
		}
        
        //2차감염이나 그 이상이 있는지 확인해야함, 재귀로 감염이 나오면 안 나올때까지 계속 돌려야함
        for(int i=0; i<M; i++){
            check_infect(arr2[i], M);
        }

        for(int i=0; i<M; i++){
            for(int j=0; j<N; j++){
                if(arr[party[i][j]] == 1){ //어떠한 파티에 감염된 사람이 한명이라도 있으면 파티 취소
                    ans--;
                    break;
                }
            }
        }

		System.out.println(ans);
		
		scan.close();
	}
}
 
저작자표시 (새창열림)

'BOJ > 그래프' 카테고리의 다른 글

3197번: 백조의 호수 (BOJ C/C++)  (0) 2022.08.22
9328번: 열쇠 (BOJ C/C++)  (0) 2022.08.20
11967번: 불켜기  (0) 2022.08.20
16933번: 벽 부수고 이동하기 3  (0) 2022.08.19
14442번: 벽 부수고 이동하기 2  (0) 2022.08.19
    'BOJ/그래프' 카테고리의 다른 글
    • 3197번: 백조의 호수 (BOJ C/C++)
    • 9328번: 열쇠 (BOJ C/C++)
    • 11967번: 불켜기
    • 16933번: 벽 부수고 이동하기 3
    둠치킨
    둠치킨
    코딩 공부를 위한 코딩 블로그 기록 일기

    티스토리툴바