https://www.acmicpc.net/problem/16940
16940번: BFS 스페셜 저지
올바른 순서는 1, 2, 3, 4와 1, 3, 2, 4가 있다.
www.acmicpc.net
저는 BFS를 통해 문제를 해결하였습니다.
일반적인 BFS랑 다르게 Set을 통해 노드의 연결을 표시하였습니다.
BFS 진행은 해당 값이 Set에 존재하면 진행하고 그렇지 않으면 FAIL하도록 하였습니다.
package BOJ.bfs;
import java.io.BufferedReader;
import java.io.InputStreamReader;
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_16940 {
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>[] set = new HashSet[n+1];
for(int i = 0 ; i <= n ; i++){
set[i] = new HashSet<>();
}
for(int i = 0 ; i < n-1 ; i++){
st = new StringTokenizer(br.readLine());
int a = stoi.apply(st.nextToken());
int b = stoi.apply(st.nextToken());
set[a].add(b);
set[b].add(a);
}
int[] answer = new int[n];
st = new StringTokenizer(br.readLine());
for(int i = 0 ; i < n ; i++){
answer[i] = stoi.apply(st.nextToken());
}
System.out.println(bfs(answer,n,set));
}
private static final int SUCCESS = 1;
private static final int FAIL = 0;
private static int bfs(int[] answer, int n, Set<Integer>[] set) {
if(answer[0] != 1){
return FAIL;
}
Queue<Integer> q = new LinkedList<>();
q.offer(1);
boolean[] visited = new boolean[n+1];
int index = 1;
while(!q.isEmpty()){
int now = q.poll();
// System.out.println(now);
while(index < n && set[now].contains(answer[index]) && !visited[answer[index]]){
visited[answer[index]] = true;
q.offer(answer[index]);
index++;
}
}
if(index != answer.length){
return FAIL;
}
return SUCCESS;
}
}
'알고리즘' 카테고리의 다른 글
프로그래머스 약수의 합 (JAVA) (0) | 2022.10.01 |
---|---|
백준 20366번 같이 눈사람 만들래? (JAVA) (1) | 2022.09.30 |
프로그래머스 평균 구하기 (JAVA) (0) | 2022.09.28 |
백준 19538번 루머 (JAVA) (0) | 2022.09.27 |
백준 14395번 4연산(JAVA) (0) | 2022.09.26 |