🖇️ 문제 링크
📝 문제 분석
- BFS 탐색을 진행합니다
- 다음 방을 발견 했을 때, 그 전에 먼저 방문해야 하는 방이 있는지 확인합니다.
- 방문 한적이 있을 때 = 큐에 넣는다
- 방문 한적이 없을 때 = 지금 들어갈 수 없으므로, discovered 배열에 체크만 합니다
- 방을 방문했을 때
- y방에 방문했을 때, after[y] = x이고, discovered[x]인 경우 x는 y를 방문하지 못해서 못갔었기 때문에 이제는 갈 수 있으므로 x를 큐에 넣습니다.
⌨️ 코드
import java.util.*;
class Solution {
public boolean solution(int n, int[][] path, int[][] order) {
List<Integer>[] adj = new List[n];
int[] before = new int[n];
int[] after = new int[n];
boolean[] visited = new boolean[n];
boolean[] discovered = new boolean[n];
for(int i = 0; i < n; i++)
adj[i] = new ArrayList<>();
for(int i = 0; i < n - 1; i++) {
int u = path[i][0];
int v = path[i][1];
adj[u].add(v);
adj[v].add(u);
}
for(int i = 0; i < order.length; i++) {
before[order[i][1]] = order[i][0];
after[order[i][0]] = order[i][1];
}
if(before[0] != 0)
return false;
Queue<Integer> q = new LinkedList<>();
discovered[0] = true;
q.add(0);
while(!q.isEmpty()) {
int cur = q.poll();
visited[cur] = true;
if(after[cur] != 0 && discovered[after[cur]]) {
q.add(after[cur]);
}
for(var next : adj[cur]) {
if(visited[next]) continue;
if(before[next] != 0 && !visited[before[next]]) {
discovered[next] = true;
continue;
}
discovered[next] = true;
q.add(next);
}
}
for(var b : visited)
if(!b) return false;
return true;
}
}
Uploaded by Notion2Tistory v1.1.0