Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 17장
- 2166번
- BOJ
- Adapater Pattern
- 냄새와 휴리스틱
- Design Pattern
- 프로그래머스
- java
- 11758번
- Spring
- 클린코드
- 자바의 정석
- Dxerr.h
- 2206번
- 코딩테스트
- SerialDate 리펙터링
- 2156번
- DxTrace
- 백준
- java의 정석
- 코딩 테스트
- 가장 긴 증가하는 부분 수열2
- 1300번
- 10830번
- 1043번
- springboot
- 11286번
- 9장
- Design Patterns
- programmers
Archives
- Today
- Total
Don't give up!
[백준] 1043번: 거짓말 (java) 본문
어떻게 생각하고 문제를 풀었는가?
진실을 아는 사람과 같은 파티에 속한 사람은 진실을 아는 사람이 됩니다.
결과적으로 과장된 이야기를 할 수 있는 파티를 찾기 위해서는 진실을 아는 사람들과 같은 파티에 참여하지 않아야 합니다.
BFS로 진실을 아는 사람들이 참여하는 파티를 순회하며 다른 사람들을 queue에 넣음으로써 진실을 아는 파티와 그렇지 않은 파티를 계산할 수 있을 것이라고 생각하였습니다.
코드
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer tokenizer;
tokenizer = new StringTokenizer(reader.readLine());
int N = Integer.parseInt(tokenizer.nextToken());
List<Integer>[] participating = new List[N+1];
for(int i=1; i<=N; i++){
participating[i] = new ArrayList<>();
}
int M = Integer.parseInt(tokenizer.nextToken());
tokenizer = new StringTokenizer(reader.readLine());
int truth = Integer.parseInt(tokenizer.nextToken());
boolean[] enlightened = new boolean[N+1];
Queue<Integer> queue = new LinkedList<>();
for(int i=0; i<truth; i++){
queue.add(Integer.parseInt(tokenizer.nextToken()));
}
int[][] attendees = new int[M][];
for(int i=0; i<M; i++){
tokenizer = new StringTokenizer(reader.readLine());
int quota = Integer.parseInt(tokenizer.nextToken());
attendees[i] = new int[quota];
for(int j=0; j<quota; j++){
int person = Integer.parseInt(tokenizer.nextToken());
attendees[i][j] = person;
participating[person].add(i);
}
}
reader.close();
boolean[] parties = new boolean[M];
while(!queue.isEmpty()){
int person = queue.poll();
if(enlightened[person]) continue;
enlightened[person] = true;
for(int party : participating[person]){
if(parties[party]) continue;
for(int other : attendees[party]){
queue.add(other);
}
parties[party] = true;
}
}
int result = 0;
for(boolean exaggerated : parties){
if(!exaggerated) {
result++;
}
}
System.out.println(result);
}
}
Queue를 사용하여 BFS를 구현하였습니다.
이번 문제에서는 파티에 속한 사람들의 정보들이 주어지고, 진실을 아는 사람들을 순회하여 다른 사람들을 queue에 추가해야 하기 때문에 각 사람들이 참여하는 파티들의 정보를 List 배열로, 각 파티에 참여하는 사람들의 정보를 2차원 int 배열로 선언하였습니다.
Queue를 순회하며 해당 사람이 참여한 파티들 중 체크하지 않은 파티에 대해 진실을 몰랐던 사람들을 Queue에 넣음으로써 결과적으로 진실을 아는 파티와 모르는 파티를 가려낼 수 있습니다.
'Coding Test > BOJ' 카테고리의 다른 글
[백준] 1931번 : 회의실 배정 (java) (0) | 2021.08.14 |
---|---|
[백준] 2206번 : 벽 부수고 이동하기 (java) (0) | 2021.08.10 |
[백준] 1929번 : 소수 구하기 (java) (0) | 2021.08.08 |