/*
1. ๊ฐ source์ ๋ํด result๋ฅผ ๊ตฌํด์ผํ๋ค
2. ๋ชจ๋ ๊ฐ์ค์น๊ฐ 1์ด๋ ์ฐ์ BFS๋ก ํ์ด๋ณด๊ณ ์๋๋ฉด ๋ค์ต์คํธ๋ผ๋ก.
*/
class Solution {
static ArrayList<ArrayList<Integer>> roadList = new ArrayList<>();
static int N;
static int target;
static int[] dist;
public int[] solution(int n, int[][] roads,int[] sources, int destination) {
dist = new int[n+1];
Arrays.fill(dist,-1);
int[] answer = new int[sources.length];
N = n;
target = destination;
//mapํฌ๊ธฐ๋งํผ arrayList๋ง๋ค๊ธฐ
for(int i=0;i<=n;i++){
roadList.add(new ArrayList<>());
}
//๊ฐroad์ ์ฅ
for(int i=0;i<roads.length;i++){
int from = roads[i][0];
int to = roads[i][1];
roadList.get(from).add(to);
roadList.get(to).add(from);
}
bfs(destination);
for(int i=0;i<sources.length;i++)
answer[i] = dist[sources[i]];
return answer;
}
static void bfs(int start){
boolean[] visited = new boolean[N+1];
Queue<Integer> q = new LinkedList<>();
q.offer(start);
int level = 0;
visited[start] = true; //๋ฐฉ๋ฌธ์ฒ๋ฆฌ
while(!q.isEmpty()){
int size = q.size();
for(int reps=0 ; reps<size ; reps++){
int source = q.poll();
dist[source] = level;
ArrayList<Integer> list = roadList.get(source); //ํด๋น ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๊ธธ ํ์
for(int i=0;i<list.size();i++){
int next = list.get(i);
if(!visited[next]){
visited[next] = true; //๋ฐฉ๋ฌธ์ฒ๋ฆฌ
q.offer(next);
}
}
}
level++;
}
}
}
๊ฐ์ค์น๊ฐ 1์ผ๋์๋ BFS๋ก๋ ํ์ด๊ฐ ๊ฐ๋ฅํ๋ค. ํด๋ณด๊ณ ํน์ ์๋๋ฉด ๋ค์ต์คํธ๋ผ๋ก ํ์ด๋ณด๋ ค๊ณ ํ๋ค.
ํต์ฌ์ ๊ฐ
source
์ ์์๋ง๋คbfs
๋ฅผ ๋งค๋ฒ ํธ์ถํ๋ ๊ฒ์ด ์๋๋ผdestination
์์ ๊ฐ ๋ ธ๋๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ํ๋ฒ๋ง ๊ตฌํ๊ณ ์ด๋ฅผdis
t๋ฐฐ์ด์ ๊ธฐ๋กํ๋ค ํ์ด์ผ ์๊ฐ์ด๊ณผ๊ฐ ์๋๋ค.source[i] -> destination
์ ๊ฐ source๋ง๋ค ๊ตฌํ์ง ๋ง๊ณdestination -> source[i]
๋ฅผ ๊ตฌํ๋ ํจ์ ํ๋ฒ๋ง ํธ์ถํ ๋ค ๋ต ์ถ๋ ฅ!
- BFS๋ฅผ ํ ๋ level์ ์ ์ธํด์ ๊น์ด๊ฐ 1์ฉ ๊น์ด์ง๋๋ง๋ค ์ฆ๊ฐ์์ผ์คฌ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ช๊ฐ์ ๋ ธ๋๋ฅผ ๊ฑฐ์ณค๋์ง ์ ์ ์๋ค.
- ๋ํ ํ์์ ๊บผ๋ผ ๋ ๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ ํ๋๋ฐ ๊ทธ๋ฌ๋ฉด ํ์ ์ค๋ณต๋ ๋
ธ๋๊ฐ ๋ค์ด๊ฐ๊ณ ์๋ชป๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ค์ด๊ฐ ์ ์๋ค. ๋ฐ๋ผ์
offer()
ํ๊ธฐ ์ ์ ๋ฏธ๋ฆฌ ๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ ํด์ค์ผํ๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ๋ณ๊ฑฐ ์๋๊ธด ํ๋ฐ size๋ณ์๋ฅผ ๋ฐ๋ก ํ ๋นํด์
for(int reps=0 ; reps<size ; reps++)
๋ผ๋ ๊ตฌ๋ฌธ์ ๋ง๋ค์ง ์๊ณfor(int reps=0; reps<q.size() ; reps++)
๋ก ํด๋ฒ๋ฆฌ๋ฉด ํ์ ์ฌ์ด์ฆ๊ฐ ์์๋ก ๋ณํด์level
์ ์ ํํ ๊ตฌํ ์ ์๋ค.์ถ๊ฐ๋ก 2์ฐจ์ ๋ฐฐ์ด์ด ์๋๋ผ 2์ฐจ์ ArrayList๋ฅผ ์จ์ ์กด์ฌํ๋ ๊ธธ๋ง ํ์ํ๋๋กํ๋ค. ๋ ธ๋์ ๊ฐ์๊ฐ 100,000๊ฐ์ด๋๊น 100,000 * 100,000 ๋ฐฐ์ด์ ๋ง๋๋ ๊ฒ๋ณด๋ค ํจ์จ์ ์ด๋ค.