๐ Link : https://www.acmicpc.net/problem/10971
๐ก ์ ๊ทผ ๋ฐฉ๋ฒ
1. ๋ฌธ์ ์ดํด
์ฒซ์งธ ์ค์ ๋์์ ๊ฐ์ N์ด ์ฃผ์ด์ง๋ค. ๊ทธ๋ฆฌ๊ณ N๊ฐ์ ๋์๋ฅผ ๋ชจ๋ ๋ฐฉ๋ฌธํ๋ ์ต์์ ๋น์ฉ์ ๊ตฌํ๋ ๋ฌธ์ ๋ค.
์๋ฅผ ๋ค์ด 1->2->3->4->1 ์ด๋ ๊ฒ ๋ฐฉ๋ฌธ๊ฐ๋ฅํ๋ค. ์ฌ๊ธฐ์ ํฌ์ธํธ๊ฐ ์๋ค.
- ์ด๋ ํ ๋์์์ ์ถ๋ฐํด N๊ฐ์ ๋์๋ฅผ ๋ชจ๋ ๊ฑฐ์ณ ๋ค์ ์๋์ ๋์๋ก ๋์์ค๋ ์ํ ์ฌํ ๊ฒฝ๋ก๋ฅผ ๊ณํ
- N = 4 ์ผ๊ฒฝ์ฐ 1๋ฒ ๋์๋ฅผ ์์ํด์ ์ํํ๊ณ , ๊ทธ๋ค์ 2๋ฒ ๋์๋ฅผ ์์,... ๋ง์ง๋ง 4๋ฒ ๋์๋ฅผ ์์
- ๋จ, ํ ๋ฒ ๊ฐ๋ ๋์๋ก๋ ๋ค์ ๊ฐ ์ ์๋ค.
- 1->2->1->3->4->1 ๋ถ๊ฐ๋ฅ
- ๋งจ ๋ง์ง๋ง์ ์ฌํ์ ์ถ๋ฐํ๋ ๋์๋ก ๋์์ค๋ ๊ฒ์ ์์ธ
4
1: 0 10 15 20
2: 5 0 9 10
3: 6 13 0 12
4: 8 8 9 0
return 35
๋์ 1 → ๋์ 2 → ๋์ 4 → ๋์ 3 → ๋์ 1 ์ด๋ ๋น์ฉ:
10(๋์ 1์์ 2๋ก) + 10(๋์ 2์์ 4๋ก) + 9(๋์ 4์์ 3์ผ๋ก) + 6(๋์ 3์์ 1๋ก) = 35
2. ๋ฌธ์ ํ์ด
- ์ด๋ ํ ๋์์์ ์ถ๋ฐํด N๊ฐ์ ๋์๋ฅผ ๋ชจ๋ ๊ฑฐ์ณ ๋ค์ ์๋์ ๋์๋ก ๋์์ค๋ ์ํ ์ฌํ ๊ฒฝ๋ก๋ฅผ ๊ณํ
- for ๋ฐ๋ชฉ๋ฌธ์ ์ฌ์ฉํด ์์ ๋์๋ฅผ ์ค์ ํ๊ณ isVisited๋ฅผ ์ด๊ธฐํ๋ฅผ ํด์ค๋ค.
for (int i = 0; i < N; i++) {
isVisited = new boolean[N];
isVisited[i] = true;
backtracking(i, i, 0, 0);
// backtracking(int start, int now, int depth, int cost)
}
- ๋จ, ํ ๋ฒ ๊ฐ๋ ๋์๋ก๋ ๋ค์ ๊ฐ ์ ์๋ค.
- isVisited ๋ผ๋ boolean []์ ๋ง๋ค์ด์ ๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ ํ๊ณ backtracking์ ์ ์ฉํ ๊ณํ์ด๋ค.
for (int i = 0; i < N; i++) {
if (!isVisited[i] && arr[now][i] != 0) {
isVisited[i] = true;
backtracking(start, i, depth + 1, cost + arr[now][i]);
isVisited[i] = false;
}
}
์์ ๋์๋ฅผ ํฌํจํ์ฌ N๊ฐ์ ๋์๋ฅผ ๋ชจ๋ ๋ฐฉ๋ฌธํ์ ๋์ ๊ฐ depth๊ฐ N-1 ์ด๊ธฐ ๋๋ฌธ์ ํ์ถ์กฐ๊ฑด์ผ๋ก ์ค์ ํด ์คฌ๋ค. ํ์ง๋ง ์ฌ๊ธฐ์ ๋ชจ๋ ๋์๋ฅผ ๋ฐฉ๋ฌธํ ๊ฒ์ ๋ง์ง๋ง ๋ง์ง๋ง ๋์์์์ ์ถ๋ฐ ๋์๋ก ๋ค์ ๊ฐ ์ ์๋์ง ํ์ธํ๊ณ ๊ทธ ๊ฐ์ ๋ํด์ค์ผ ํ๋ค.
if (depth == N - 1 && arr[now][start] != 0) {
answer = Math.min(answer, cost + arr[now][start]);
return;
}
๐ ํ์ด ์ฝ๋
1์ฐจ ํ์ด์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
static int N, answer;
static boolean[] isVisited;
static int[][] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
answer = Integer.MAX_VALUE;
arr = new int[N][N];
for (int i = 0; i < N; i++) {
arr[i] = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
}
for (int i = 0; i < N; i++) {
isVisited = new boolean[N];
isVisited[i] = true;
backtracking(i, i, 0, 0);
}
System.out.println(answer);
}
private static void backtracking(int start, int now, int depth, int cost) {
if (depth == N - 1 && arr[now][start] != 0) {
answer = Math.min(answer, cost + arr[now][start]);
return;
}
for (int i = 0; i < N; i++) {
if (!isVisited[i] && arr[now][i] != 0) {
isVisited[i] = true;
backtracking(start, i, depth + 1, cost + arr[now][i]);
isVisited[i] = false;
}
}
}
}
๋ค๋ฅธ ์ฌ๋์ ํ์ด ์ฝ๋๋ฅผ ๋ณด๋ค ์ ๊ธฐํ ๊ฒ์ ๋ฐ๊ฒฌํ๋๋ฐ ์ด๋ ๋์๋ฅผ ์์์ ์ผ๋ก ์ผ์๋ ์ต์๋น์ฉ์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค๋ ๊ฒ์ด๋ค. ์ด๋ฅผ ์ ์ฉํ๋ฉด ๊ตณ์ด for๋ฌธ์ ๋๋ ค์ ๋ชจ๋ ๋์๋ฅผ ์ถ๋ฐํ์ง ์๊ณ 1๋ฒ ๋์๋ง ์์ํด๋ ๊ฐ์ ์ต์๋น์ฉ์ ๊ตฌํ ์ ์๋ค.
2์ฐจ ํ์ด์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
static int N, answer;
static boolean[] isVisited;
static int[][] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
answer = Integer.MAX_VALUE;
arr = new int[N][N];
for (int i = 0; i < N; i++) {
arr[i] = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
}
// for (int i = 0; i < N; i++) {
// isVisited = new boolean[N];
// isVisited[i] = true;
// backtracking(i, i, 0, 0);
// }
isVisited = new boolean[N];
isVisited[0] = true;
backtracking(0, 0, 0, 0);
System.out.println(answer);
}
private static void backtracking(int start, int now, int depth, int cost) {
if (depth == N - 1 && arr[now][start] != 0) {
answer = Math.min(answer, cost + arr[now][start]);
return;
}
for (int i = 0; i < N; i++) {
if (!isVisited[i] && arr[now][i] != 0) {
isVisited[i] = true;
backtracking(start, i, depth + 1, cost + arr[now][i]);
isVisited[i] = false;
}
}
}
}
ํ์คํ ์๊ฐ์ด ๊ฑฐ์ 2๋ฐฐ ๊ฐ๊น์ด ์ค์ด๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] 15664๋ฒ: N๊ณผ M(10) (0) | 2024.03.31 |
---|---|
[Java] 2023๋ฒ: ์ ๊ธฐํ ์์ (0) | 2024.03.02 |
[Java] 19942๋ฒ: ๋ค์ด์ดํธ (0) | 2024.02.01 |
[Java] 15686๋ฒ: ์นํจ ๋ฐฐ๋ฌ (1) | 2024.01.30 |