https://www.acmicpc.net/problem/19538
19538번: 루머
예제 1 0분 : 최초 유포자($1$, $6$번 사람)가 루머를 생성한다. 1분 : $1$번 사람은 $2$, $3$번 사람에게 루머를 퍼뜨린다. $2$번 사람은 주변인 $2$명 중 $1$명이 루머를 믿고 있어 루머를 믿게 된다. $3$
www.acmicpc.net
저는 BFS를 통해 문제를 해결하였습니다.
BFS를 통해 유포자부터 시작하여 각각의 사람들이 친구의 수 / 2 보다 유포한 친구의 수 이상이라면 BFS를 진행하도록 하였습니다.
package BOJ.bfs;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.function.Function;
public class BOJ_19538 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
Function<String,Integer> stoi = Integer::parseInt;
int n = stoi.apply(st.nextToken());
Set<Integer>[] friend = new HashSet[n+1];
for(int i = 1; i <= n ; i++){
friend[i] = new HashSet<>();
st = new StringTokenizer(br.readLine());
int num = stoi.apply(st.nextToken());
while(num != 0){
friend[i].add(num);
num = stoi.apply(st.nextToken());
}
}
int cnt = stoi.apply(br.readLine());
st = new StringTokenizer(br.readLine());
Queue<Integer> q = new LinkedList<>();
boolean[] visited = new boolean[n+1];
for(int i = 0 ; i < cnt ; i++){
int num = stoi.apply(st.nextToken());
q.offer(num);
visited[num] = true;
}
bfs(q,friend,n,visited);
}
private static void bfs(Queue<Integer> q,Set<Integer>[] friend, int n ,boolean[] visited) {
int[] result = new int[n+1];
int[] cnt = new int[n+1];
Arrays.fill(result,-1);
int time = 0;
while(!q.isEmpty()){
int size = q.size();
for(int s = 0 ; s < size ; s++){
int now = q.poll();
visited[now] = true;
result[now] = time;
for(int next : friend[now]){
cnt[next]++;
if(!visited[next] && cnt[next] >= (friend[next].size() +1) /2){
visited[next] = true;
q.offer(next);
}
}
}
time++;
}
StringBuilder sb = new StringBuilder();
for(int i = 1 ; i <= n ; i++){
sb.append(result[i]+" ");
}
System.out.println(sb);
}
}
'알고리즘' 카테고리의 다른 글
백준 16940번 BFS 스페셜 저지 (JAVA) (0) | 2022.09.29 |
---|---|
프로그래머스 평균 구하기 (JAVA) (0) | 2022.09.28 |
백준 14395번 4연산(JAVA) (0) | 2022.09.26 |
프로그래머스 PCCP 모의고사 4번 (JAVA) (0) | 2022.09.25 |
프로그래머스 PCCP 모의고사 2번 (JAVA) (1) | 2022.09.24 |