ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

[๋ฌธ์ œ]

https://school.programmers.co.kr/learn/courses/30/lessons/67260

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

[ํ’€์ด]

ํ’€์ด์˜ ํ•ต์‹ฌ์€, ํ•œ๋ฒˆ ์ง€๋‚˜์˜จ ๋…ธ๋“œ๋ผ๋ฉด ์ดํ›„ ์„ ์ˆ˜๋กœ ๋‚˜์™€์•ผํ•˜๋Š” ์ˆซ์ž๋ฅผ ํ†ตํ•ด ์ž ๊น€ ํ•ด์ œ๊ฐ€ ๋œ๋‹ค๋ฉด ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ bfs()๋ฅผ ํ†ตํ•ด ๊ทธ๋ž˜ํ”„๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉฐ, visit[][]๋ฅผ ํ†ตํ•ด ์ง€๋‚˜์˜จ ๋…ธ๋“œ๋“ค์˜ ๋ฐฉ๋ฌธ์„ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ, ์„ ์ˆ˜์กฐ๊ฑด์ด ์—†๊ฑฐ๋‚˜ ์„ ์ˆ˜์กฐ๊ฑด์„ ํ†ตํ•ด ์ž ๊ธˆ์ด ํ•ด์ œ๋˜์—ˆ๋‹ค๋ฉด ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ํ์— ๋„ฃ์œผ๋ฉฐ ๊ฐ€๋Šฅํ•œ ๋…ธ๋“œ๋“ค์„ ๋ชจ๋‘ ๋ฐฉ๋ฌธํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋•Œ, ํ์— ๋“ค์–ด๊ฐ”๋˜ ๋…ธ๋“œ๋“ค์€ ArrayList<Integer> node์— ์‚ฝ์ž…ํ•˜์—ฌ bfs()๊ฐ€ ๋๋‚œํ›„ ๋ช‡๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ์‹ค์ œ ๋ฐฉ๋ฌธํ–ˆ๋Š”์ง€ ๊ณ„์‚ฐํ•˜์—ฌ ๋ชจ๋‘ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

[์ฝ”๋“œ]

import java.util.*;
class Solution {
    static ArrayList<ArrayList<Integer>> graph = new ArrayList<ArrayList<Integer>>();
    static Map<Integer, Integer> before = new HashMap<Integer,Integer>(); // ๋จผ์ € ๋ฐฉ๋ฌธํ•ด์•ผํ•˜๋Š” value๋ฅผ ์ €์žฅ
    static Map<Integer, Integer> after = new HashMap<Integer,Integer>(); // ๋ฐฉ๋ฌธ์กฐ๊ฑด ๋งŒ์กฑํ•˜๋ฉด ๋ฐฉ๋ฌธํ• ์ˆ˜์žˆ๋Š”๊ฑฐ ์ €์žฅ
    static ArrayList<Integer> node = new ArrayList<Integer>(); // ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋“ค ์ €์žฅ
    public boolean solution(int n, int[][] path, int[][] order) {
        boolean answer = true;
        
        //graph ์ดˆ๊ธฐํ™”
        for(int i=0;i<n;i++) {
            graph.add(new ArrayList<Integer>());
        }
        for(int i=0;i<path.length;i++) {
            graph.get(path[i][1]).add(path[i][0]);
            graph.get(path[i][0]).add(path[i][1]);
        }
        
        // ์ˆœ์„œ์Œ map์— ์ €์žฅ
        for(int i=0;i<order.length;i++) {
            before.put(order[i][1], order[i][0]);
            after.put(order[i][0], order[i][1]);
        }
        
        // ๊ทธ๋ž˜ํ”„ ๋ฐฉ๋ฌธ
        bfs();
        
        // ๋ชจ๋‘ ๋ฐฉ๋ฌธ ๋˜์—ˆ์œผ๋ฉด true
        if(node.size() != n) {
            answer = false;
        }
        return answer;
    }
    public static void bfs() {
        Queue<Integer> queue = new LinkedList<Integer>();
        boolean[] visit = new boolean[graph.size()];
        queue.offer(0);
        node.add(0);
        visit[0] = true;
        while(!queue.isEmpty()) {
            int p = queue.poll();
            for(Integer i:graph.get(p)) {
                // ์„ ์ˆ˜์กฐ๊ฑด์ด ์—†๊ฑฐ๋‚˜, ์„ ์ˆ˜๊ฐ€ ๋ฐฉ๋ฌธ๋œ ๋…ธ๋“œ๋“ค ์ถ”๊ฐ€
                if((before.get(i) == null || visit[before.get(i)]) && !visit[i]) {
                    node.add(i);
                    queue.offer(i);
                    // ์ถ”๊ฐ€๋œ ๋…ธ๋“œ ๋ฐฉ๋ฌธ์„ ํ†ตํ•ด ์ž ๊น€์ด ํ’€๋ ธ๋Š”๋ฐ, ์ด๋ฏธ ๋ฐฉ๋ฌธํ–ˆ๋˜ ๋…ธ๋“œ๋“ค์€ ์„ ์ˆ˜์กฐ๊ฑด์ด ๋งŒ์กฑ๋˜์–ด ํ์— ์‚ฝ์ž…
                    if(after.get(i) != null && visit[after.get(i)]) {
                        node.add(after.get(i));
                        queue.offer(after.get(i));
                    }
                }
                visit[i] = true;
            }
        }
    }
}

ใ…