๋ฌธ์
ํ์ด
1๏ธโฃ bfs์ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ ํ์ด
๐ก ์ฐธ๊ณ ํ Idea
์ญ์ ์ N์ด ์ต๋ 100000 ์ด๊ณ ํ์ดํผ ํ๋ธ์ ํ์ดํผ ํ๋ธ๊ฐ ์ฐ๊ฒฐํ๋ ์ญ์ ๊ฐ์ K ์ M์ด ์ต๋ 1000 ์ด๋ผ์
์ผ๋ฐ์ ์ธ ๊ทธ๋ํ๋ฅผ ํธ๋ ๋ฐฉ์์ผ๋ก ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํ๋ฉด ์๊ฐ ๋ณต์ก๋๊ฐ ๋ง๋์๋๊ฒ ์ปค์ ธ์ ๊ณ ๋ฏผ์ ๋ง์ด ํ๋ค.
๊ณ์ ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํด์ผํ ์ง ๊ณ ๋ฏผํ๋ค๊ฐ ๋ค๋ฅธ ์ฌ๋์ ์์ด๋์ด๋ฅผ ์ฐธ๊ณ ํ์๋ค.
ํ์ดํผ ํ๋ธ๋ฅผ ์ผ์ข ์ ์ญ์ผ๋ก์ ์๊ฐ์ ํ๊ณ ๋ ธ๋๋ก์ ์ถ๊ฐํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ฉด ๊ณต๊ฐ๋ณต์ก๋๋ฅผ ๋ง์ด ์ค์ผ ์ ์์๋ค.
์๋ฅผ ๋ค์ด ์ญ 1๋ฒ๊ณผ
์ญ 1, 2, 3, 4 ์ ์ฐ๊ฒฐํ๋ ํ์ดํผ ํ๋ธ 1 ์ด ์๋ค๊ณ ๊ฐ์ ํ ๋
๊ธฐ์กด์๋ ์ญ(1,2) (1,3) (1,4) (2,3) (2,4) (3,4)
์ ์ฐ๊ฒฐํ์ง๋ง
ํ์ดํผ ํ๋ธ 1 ์ ์ญ 5๋ก ๊ฐ์ ํ๊ณ ์ฐ๊ฒฐํ๋ฉด(1,5) (2,5) (3,5) (4,5)
๋ง ์ฐ๊ฒฐํด์ฃผ๋ฉด ๋๋ค.
์ญ์ ๊ฐ์๊ฐ ๋์ด๋ ์๋ก ๊ธฐ์กด ๋ฐฉ์์ ๋นํด ์ฐ๊ฒฐํ๋ ํ์๋ ํฌ๊ฒ ๊ฐ์ํ๊ฒ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ bfs๋ฅผ ํตํด ํ์์ ํ๋๋ฐ, ํ์ดํผ ํ๋ธ์ ํด๋นํ๋ ์ญ์ ์ง๋๊ฐ๋์๋ ์นด์ดํ ์ ํด์ฃผ์ง ์๋ ๋ฐฉ์์ผ๋ก ๊ฑฐ์ณ๊ฐ ์ญ์ ๊ฐ์๋ฅผ ๊ตฌํ ์ ์๋ค.
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] input = br.readLine().split(" ");
int N = Integer.parseInt(input[0]), K = Integer.parseInt(input[1]), M = Integer.parseInt(input[2]);
List<List<Integer>> nodes = new ArrayList<>();
// ๋ฆฌ์คํธ์ N-1 ๋ฒ๊น์ง๋ ์ญ, N ๋ถํฐ M-1 ๊น์ง๋ ํ์ดํผํ๋ธ(๊ฐ์ง ์ญ)
for (int i = 0; i < N + M; i++) {
nodes.add(new ArrayList<>());
}
// ์ญ๊ณผ ํ์ดํผ ํ๋ธ ์ฐ๊ฒฐ
for (int i = 0; i < M; i++) {
input = br.readLine().split(" ");
int hyperTube = N + i;
for (int j = 0; j < K; j++) {
int connectedStation = Integer.parseInt(input[j]) - 1;
nodes.get(hyperTube).add(connectedStation);
nodes.get(connectedStation).add(hyperTube);
}
}
Queue<Integer> q = new LinkedList<>();
int[] checked = new int[N + M];
q.offer(0);
// ์ฒดํฌ ๋ฐฐ์ด์ ๊ฑฐ์ณ๊ฐ ํ์๋ฅผ ๊ธฐ๋ก
checked[0] = 1;
while (!q.isEmpty()) {
int num = q.poll();
if (num == N - 1) {
System.out.println(checked[num]);
System.exit(0);
break;
}
List<Integer> connects = nodes.get(num);
for (int connect : connects) {
// ์์ง ๊ฑฐ์ณ๊ฐ ์ญ์ด ์๋ ๊ฒฝ์ฐ๋ง
if (checked[connect] == 0) {
// ์ญ์ด ํ์ดํผ ํ๋ธ๊ฐ ์๋ ๊ฒฝ์ฐ ๊ฑฐ์ณ๊ฐ ํ์ + 1
if (connect < N) {
checked[connect] = checked[num] + 1;
q.offer(connect);
// ๋ค์ ์ญ์ด ๊ฐ์ง ์ญ(ํ์ดํผ ํ๋ธ) ์ธ ๊ฒฝ์ฐ ํ์ ์ฆ๊ฐ๋ฅผ ํ์ง ์์
} else {
checked[connect] = checked[num];
q.offer(connect);
}
}
}
}
System.out.println(-1);
}
}
๊ฒฐ๊ณผ
์ฒ์์๋ ์ญ์ ๊ฑฐ์ณ๊ฐ ํ์๋ int[]
๋ฐฐ์ด๋ก ํ์ ์ง์ด๋ฃ๋ ๋ฐฉ์์ ํ์๋๋ฐ, ์ด๋ ๊ฒ ํ๋ฉด ๋ฉ๋ชจ๋ฆฌ์ด๊ณผ๊ฐ ๋ฐ์ํด์ ํ์๋ ๋ฐฐ์ด๋ก์ ๋ฐ๋ก ์ฒดํฌ๋ฅผ ํ๋ ๋ฐฉ์์ ์ ์ฉํ์๋ค.