(Challenge)BFS Special Judge

2ํšŒ์ฐจ ํ’€์ด ํ‹€๋ฆฐ ์ด์œ 

  1. bfs ์ˆœ์„œ ์ž…๋ ฅ๋ฐ›์„ ๋•Œ 1์„ ๋นผ์ฃผ์ง€ ์•Š์•„์„œ ํ์— ๋„ฃ๊ณ  ๋บ€ ๊ฑด(x) 0์ธ๋ฐ, order[0] = 1, x = 0์œผ๋กœ ๊ฐ™์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— 0์ด๋ผ๋Š” ์˜ค๋‹ต์„ ์ถœ๋ ฅํ–ˆ๋‹ค.(์‚ฌ์‹ค์€ ์ œ๋Œ€๋กœ ์ž˜ ์‹คํ–‰๋œ ๊ฒƒ์ž„)

  2. ํ๊ฐ€ ๋น„์—ˆ์„ ๋•Œ 0์„ ์ถœ๋ ฅํ•˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•ด์•ผํ•œ๋‹ค.? ํ๊ฐ€ ๋น„์—ˆ์œผ๋ฉด ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ๊นŒ์ง„ ์•Œ๊ฒ ๋Š”๋ฐ ์™œ 0์„ ์ถœ๋ ฅํ•˜๋‚˜?

  • ๋ฌธ์ œ์˜ ํ•ต์‹ฌ

order์˜ ์ˆœ์„œ๊ฐ€ x์˜ ์ธ์ ‘๋…ธ๋“œ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค! x์˜ ์ธ์ ‘๋…ธ๋“œ๋ฅผ ๋ฐ”๋กœ ํ์— ๋„ฃ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ์ธ์ ‘๋…ธ๋“œ๋“ค์„ parent๋ผ๋Š” ๋ฐฐ์—ด์— ์ €์žฅํ•˜๊ณ , ์ธ์ ‘๋…ธ๋“œ ๊ฐฏ์ˆ˜๋ฅผ ์„ธ์ค€๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด x=0, x์˜ ์ธ์ ‘๋…ธ๋“œ๊ฐ€ 1,2 2๊ฐœ์ผ ๋•Œ parent[0]=1,parent[0]=2๋Š” ์•ˆ ๋˜์ง€๋งŒ, parent[1]=0,parent[2]=0 ์€ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— x์˜ ์ธ์ ‘๋…ธ๋“œ๋ฅผ ์ธ๋ฑ์Šค๋กœ ํ•˜๋Š” parent ๋ฐฐ์—ด์˜ ๊ฐ’์œผ๋กœ x๋ฅผ ๋„ฃ์–ด์ค€๋‹ค!

์ธ์ ‘๋…ธ๋“œ ๊ฐฏ์ˆ˜๋งŒํผ order ๋ฐฐ์—ด ๊ฐ’๋“ค์„ ํ์— ๋„ฃ์–ด์ค€๋‹ค! ๋‹จ, ํ์— ๋„ฃ์„ ๋•Œ, parent[order ๋ฐฐ์—ด ๊ฐ’]์ด x์ธ์ง€(x์˜ ์ธ์ ‘๋…ธ๋“œ์ธ์ง€) ํ™•์ธํ•˜๊ณ  ๋„ฃ์–ด์ค€๋‹ค! ๋งž์œผ๋ฉด ํ์— ๋„ฃ๊ณ , ์•„๋‹ˆ๋ฉด ์ˆœ์„œ๊ฐ€ ํ‹€๋ฆฐ ๊ฒƒ์ด๋ฏ€๋กœ 0์„ ์ถœ๋ ฅํ•˜๊ณ  ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ!

  • m์ด ์กด์žฌํ•˜๋Š” ์ด์œ , ์˜๋ฏธ

m์€ 1์—์„œ ์‹œ์ž‘ํ•œ๋‹ค. ๋‹จ์ˆœํžˆ ํ์˜ ํฌ๊ธฐ๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ์— ๋„ฃ์„ ์ˆ˜, order ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๊ฐ€ ๋œ๋‹ค! ์™œ๋ƒํ•˜๋ฉด order[0]์—์„œ ์‹œ์ž‘ํ•˜๊ณ , ์ด๊ฒƒ์˜ ์ธ์ ‘๋…ธ๋“œ๋Š” order[1]๋ถ€ํ„ฐ cnt(์ธ์ ‘๋…ธ๋“œ ๊ฐฏ์ˆ˜)๋งŒํผ์ด๊ธฐ ๋•Œ๋ฌธ์— 1(m)๋ถ€ํ„ฐ cnt๋งŒํผ ํ์— ๋„ฃ๊ณ ! m=1-> m+cnt=3 ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ด์ค€๋‹ค! m=3์˜ ์˜๋ฏธ๋Š” ๊ทธ ๋‹ค์Œ ์ •์ ์˜ ์ธ์ ‘๋…ธ๋“œ ์ถ”๊ฐ€๋Š” order[3]๋ถ€ํ„ฐ cnt๋งŒํผ ์ถ”๊ฐ€ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค!

import java.util.*;
public class BFS_SpecialJudge_2nd {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		ArrayList<Integer>[] a = new ArrayList[n];
		int[] parent = new  int[n];//n๋งŒํผ ์ƒ์„ฑํ•˜๋Š” ๊ฒŒ ๋งž๋‚˜?
		boolean[] c = new boolean[n];
		int[] order = new int[n];
		for(int i=0;i<n;i++) {
			a[i] = new ArrayList<>();
		}
		for(int i=0;i<n-1;i++) {//๊ฐ„์„ ์ •๋ณด ์ €์žฅ~
			int u = sc.nextInt()-1;
			int v = sc.nextInt()-1;
			a[u].add(v);a[v].add(u);
		}
		for(int i=0;i<n;i++) {
			order[i] = sc.nextInt()-1;
		}
		//์ธ์ ‘๋…ธ๋“œ๋ฅผ ๋Œ๋ฉด์„œ ์ธ์ ‘๋…ธ๋“œ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” parent๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๊ณ , ํ˜„์žฌ ์ •์  x์˜ ์ธ์ ‘๋…ธ๋“œ ๊ฐฏ์ˆ˜๋ฅผ ์„ธ์ค€๋‹ค!
		Queue<Integer> q = new LinkedList<Integer>();
		q.add(0);c[0] = true;
		int m=1;
		for(int i=0;i<n;i++) {//i๋Š” 0๋ถ€ํ„ฐ ์ •์  ๊ฐฏ์ˆ˜๋งŒํผ ๋ฐ˜๋ณตํ•œ๋‹ค. order[0]๋ถ€ํ„ฐ order[n-1]๊นŒ์ง€.
			//Round1.ํ์—์„œ ๊บผ๋‚ธ x(0)์™€ order[0] ๋น„๊ต.
			//Round2.x(0)์˜ ์ธ์ ‘๋…ธ๋“œ๋ฅผ ํ์— ๋„ฃ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—
			//		x(0)์˜ ์ธ์ ‘๋…ธ๋“œ์™€ order[1]๊ณผ ๋น„๊ต. - x์˜ ์ธ์ ‘๋…ธ๋“œ : 1,2 ์ด๊ณ  order:0 1 2 3 ๋˜๋Š” 0 2 1 3์ผ ๋•Œ
			//parent[1] = 0, parent[2] = 0 1,2 ๋‘˜๋‹ค parent ๊ฐ’์ด x์ด๋ฏ€๋กœ(์ธ์ ‘๋…ธ๋“œ๊ฐ€ x) ๋งŒ์กฑ~!
			//์ด๋Ÿฌํ•œ n๊ฐœ์˜ ์ •์ ์— ๋Œ€ํ•ด order์˜ ๊ฐ ๊ฐ’๊ณผ ๋น„๊ต ์—ฐ์‚ฐ์„ n๊ฐœ ๋งŒํผ๋ฐ˜๋ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— for(i=0~n)๋Œ๋ ค์ค€๋‹ค!
			if(q.isEmpty()) {//ํ๊ฐ€ ๋น„๋ฉด? bfs ๋‹ค ๋Œ์•˜๋‹ค๋Š” ๋œป.๊ทผ๋ฐ ์™œ 0์ถœ๋ ฅํ•˜๊ณ  ์ข…๋ฃŒํ•˜๋‚˜?
				System.out.println(0);
				System.exit(0);
			}
			int x = q.remove();
			if(x != order[i]) {
				System.out.println(0);
				System.exit(0);
			}
			int cnt=0;
			for(int y:a[x]) {
				if(c[y]==false) {
					parent[y] = x;cnt++;//์ธ์ ‘ ๋…ธ๋“œ ๊ฐฏ์ˆ˜ ์„ผ๋‹ค!
				}
			}
			for(int j=0;j<cnt;j++) {
				if(m+j>=n || parent[order[m+j]] != x) {
					System.out.println(0);
					System.exit(0);
				}
				q.add(order[m+j]);
				c[order[m+j]]=true;
			}
			m+=cnt;
		}
		System.out.println(1);
	}

}

Last updated