[Java] ํ๋ก๊ทธ๋๋จธ์ค - ๋๊ตด ํํ
[๋ฌธ์ ]
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;
}
}
}
}
ใ