2023. 11. 29. 16:22ใ์ธํ๋ฐ/์๋ฐ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด ์ ๋ฌธ : ์ฝ๋ฉํ ์คํธ ๋๋น
https://hyejin.tistory.com/1263
-> ์ด์ ๋ฌธ์ ํ์ด
12. ๊ฒฝ๋ก ํ์ (์ธ์ ๋ฆฌ์คํธ)
์ค๋ช
๋ฐฉํฅ๊ทธ๋ํ๊ฐ ์ฃผ์ด์ง๋ฉด 1๋ฒ ์ ์ ์์ N๋ฒ ์ ์ ์ผ๋ก ๊ฐ๋ ๋ชจ๋ ๊ฒฝ๋ก์ ๊ฐ์ง ์๋ฅผ ์ถ๋ ฅํ๋ ํ ๋ก๊ทธ๋จ์ ์์ฑํ์ธ์.
์๋ ๊ทธ๋ํ์์ 1๋ฒ ์ ์ ์์ 5๋ฒ ์ ์ ์ผ๋ก ๊ฐ๋ ๊ฐ์ง ์๋
1 2 3 4 5
1 2 5
1 3 4 2 5
1 3 4 5
1 4 2 5
1 4 5
์ด 6 ๊ฐ์ง์ ๋๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์๋ ์ ์ ์ ์ N(1<=N<=20)์ ๊ฐ์ ์ ์ M๊ฐ ์ฃผ์ด์ง๋ค. ๊ทธ ๋ค์๋ถํฐ M์ค์ ๊ฑธ์ณ ์ฐ ๊ฒฐ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ด ๊ฐ์ง์๋ฅผ ์ถ๋ ฅํ๋ค.
์์ ์ ๋ ฅ 1
5 9
1 2
1 3
1 4
2 1
2 3
2 5
3 4
4 2
4 5
์์ ์ถ๋ ฅ 1
6
๋ฌธ์ ํ์ด 1
public class RouteNavigation_list
{
static int n, m, answer = 0;
static ArrayList<ArrayList<Integer>> graph;
static int[] ch;
public int DFS(int v) {
if (v == n) {
answer++;
}else {
for (int nv : graph.get(v)) {
if (ch[nv] == 0) {
ch[nv] = 1;
DFS(nv);
ch[nv] = 0;
}
}
}
return answer;
}
public static void main(String[] args)
{
RouteNavigation_list routeNavigationList = new RouteNavigation_list();
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
m = scanner.nextInt();
graph = new ArrayList<>();
for (int i = 0; i <= n; i++) { // get(5) ๊น์ง ํ๊ธฐ ์ํด์ n๊น์ง ๋ฐ๋ณต
graph.add(new ArrayList<>()); // ์ ์๋ฅผ ์ ์ฅํ๊ธฐ ์ํ Arraylist ๊ฐ์ฒด ์ ์ฅ
}
ch = new int[n+1];
for (int i = 0; i < m; i++) {
int a = scanner.nextInt();
int b = scanner.nextInt();
graph.get(a).add(b);
}
ch[1] = 1;
int result = routeNavigationList.DFS(1);
System.out.println(result);
}
}
๐พ : ์ด์ ๋ฌธ์ ํ์ด์์ ๊ฒฝ๋ก ํ์์ ์ธ์ ํ๋ ฌ๋ก ํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ ๋๋ฐ ์ฌ์ค ์ธ์ ํ๋ ฌ์ 2์ฐจ์ ๋ฐฐ์ด์ ํ์ฉํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ ธ๋์ ๊ฐ์๊ฐ ๋์ด๋๋ฉด ์ด๋ฅผ ๊ฐ๋นํ๊ธฐ ํ๋ค๋ค. N์ด ๋ง์ฝ 10000 ์ด๋ฌ๋ฉด 10000 * 10000 ๋ฐฐ์ด์ ๋ง๋ค์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ณ์ฐ ์๊ฐ์ด N์ด ํด์๋ก ์ ์ ๋์ด๋๋ค.
๋ฐ๋ผ์ ์ธ์ ํ๋ ฌ ๋ณด๋ค๋ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ํ์ฉํด์ ๋ฌธ์ ๋ฅผ ํธ๋ ๊ฒ์ด ๋ ์ข๋ค.
์ธ์ ๋ฆฌ์คํธ๋ฅผ ํ์ฉํ ๋๋ ArrayList ๋ก subGraph ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด์ subGraph.get(1) ์๋ ๋ ธ๋ 1์ด ๊ฐ ์์๋ ๋ ธ๋ 2, 3, 4 ๋ฅผ ์ ์ฅํ๊ณ , subGraph.get(2)์๋ ๋ ธ๋ 2๊ฐ ํฅํ๊ณ ์๋ ๋ ธ๋๋ฅผ ์ ์ฅํ๊ณ ... ํด์
subGraph.get(1), subGraph.get(2), subGraph.get(3), subGraph.get(4), subGraph.get(5) ๋ฅผ ์ ์ฅํ๋ Arraylist๋ฅผ ๋ง๋ ๋ค.
-> ArrayList<Arraylist<Integer>> graph๋ฅผ ๋ง๋ค๋ผ๋ ๋ป ! ( ArrayList<subGraph> graph)
for (int i = 0; i <= n; i++) { // get(5) ๊น์ง ํ๊ธฐ ์ํด์ n๊น์ง ๋ฐ๋ณต
graph.add(new ArrayList<>()); // ์ ์๋ฅผ ์ ์ฅํ๊ธฐ ์ํ Arraylist ๊ฐ์ฒด ์ ์ฅ
}
ch = new int[n+1];
for (int i = 0; i < m; i++) {
int a = scanner.nextInt();
int b = scanner.nextInt();
graph.get(a).add(b);
}
ch[1] = 1;
int result = routeNavigationList.DFS(1);
System.out.println(result);
-> ๋ฉ์ธ ๋ฉ์๋์์ graph ๋ฅผ ์ด๊ธฐํํด์ค์ผ ํ๋๋ฐ ๋ ธ๋ 1 ~ ๋ ธ๋ 5๊น์ง์ arraylist๋ฅผ ์ ์ฅํ๊ธฐ ์ํด์ for๋ฌธ์ ํตํด 0๋ถํฐ n๊น์ง ๊ตฌํด์ค๋ค. (๊ทธ๋์ผ 0์ ์ ์ธํ๊ณ ์ถ๊ฐํ ์ ์์)
๊ทธ๋ฆฌ๊ณ for๋ฌธ์ ํตํด์ graph.get(a) ๋ฅผ ํตํด ๋ ธ๋ a๊ฐ ํฅํ ์ ์๋ ๋ ธ๋ b๋ฅผ add ํด์ค๋ค.
๊ทธ๋ฆฌ๊ณ ๋จผ์ 1๋ถํฐ ์์ํ๊ธฐ ๋๋ฌธ์ ch[1]์ ๋ฐฉ๋ฌธํ๋ค๋ ๋ป์ผ๋ก 1๋ก ๋ณ๊ฒฝํด์ฃผ๊ณ DFS ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
public int DFS(int v) {
if (v == n) {
answer++;
}else {
for (int nv : graph.get(v)) {
if (ch[nv] == 0) {
ch[nv] = 1;
DFS(nv);
ch[nv] = 0;
}
}
}
return answer;
}
๊ทธ๋ฆฌ๊ณ DFS๋ ์ธ์ ํ๋ ฌ์ ๋นํด ์ฝ๋๊ฐ ์ข ๋ ๊ฐ๊ฒฐํด์ง ๊ฒ์ ํ์ธํ ์ ์๋ค.
DFS๋ ๊ธฐ๋ณธ ํ๋ก if-else๋ก ๊ฐ๋ฉด ๋๋๋ฐ if์๋ ๋จผ์ v๊ฐ n๊น์ง ๊ฐ๋ค๋ ๊ฒ์ ๋ง๋จ ๋ ธ๋๋ผ๋ ๋ป์ด๊ธฐ ๋๋ฌธ์ DFS ๋ฉ์๋๋ฅผ ํธ์ถํ์ง ์๊ณ answer +1 ํด์ค๋ค.
๋ง์ฝ n ์ด v๊ฐ ์๋๋ผ๋ฉด graph.get(v)๋ฅผ ํตํด v ๋ ธ๋๊ฐ ๊ฐ ์ ์๋ ๋ ธ๋ nv ๊บผ๋ด๊ณ , ์ด ๋ ธ๋ nv๊ฐ ๋ฐฉ๋ฌธํ ๋ ธ๋์ธ์ง ํ์ธํด๋ณด๊ณ (ch[nv] ==1) , ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ผ๋ฉด (ch[nv] == 0) ch[nv] ์ 1๋ก ๋ฐ๊พธ๊ณ , DFS(nv)๋ฅผ ํธ์ถํด์ nv ๊ธฐ์ค์ผ๋ก ๋ ์ด ๊ณผ์ ์ ๋ฐ๋ณตํด์ฃผ๋ฉด ๋๋ค.