알고리즘

백준 16940번 BFS 스페셜 저지 (JAVA)

박카스마시며코딩 2022. 9. 29. 19:01

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;
    }
}