๐ Link : https://www.acmicpc.net/problem/15686
๐ก ์ ๊ทผ ๋ฐฉ๋ฒ
1. ๋ฌธ์ ์ดํด & ์ ํฉํ ์๊ณ ๋ฆฌ์ฆ ์ฐพ๊ธฐ
์ต๋ ์นํจ์ง์ ๊ฐ์(M) ๊ฐ์์ ๊ฐ์ฅ ์์ ์นํจ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ๋ค. ๋ชจ๋ ์ต๋ ์นํจ์ง์ ๊ฐ์๋ฅผ ํ์ธํ๋ฉด์ ์ต์์ ๊ฐ์ ์ฐพ์ผ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ๋ฐฑํธ๋ ํน์ ์ฌ์ฉ์ ํ๋ ๊ฒ ์ข์ ๋ณด์ธ๋ค. ๋น์ทํ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ธ๋ฃจํธ ํฌ์ค๊ฐ ์๋๋ฐ ์ฐจ์ด์ ์ ํ์ธํด ๋ณด์.
- ๋ธ๋ฃจํธ ํฌ์ค : ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ํ์ธํจ / ๋ ธ๊ฐ๋ค / ์ต์ ํด๋ฅผ ๋ณด์ฅํ๋ค
- ๋ฐฑํธ๋ ํน : ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ํ์ธํ์ง๋ง ๋ฅผ ํด์ ์ํ๋ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ๋ชปํ๋ฉด ํ์์ค๋จ ํ ์ด์ ๋จ๊ณ๋ก ๋์๊ฐ / ๊ฐ์ง์น๊ธฐ
2. ๋ฌธ์ ํ์ด
๋ฐฑํธ๋ ํน ์๊ณ ๋ฆฌ์ฆ์ BFS, DFS์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด๋ ์ ๋ ์ ํด์ง ๊ท๊ฒฉ์ด ์๋ค. ์ํ๋ ์กฐ๊ฑด์ ์ค์ ํ๊ณ ํ์ถํ๋ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์ ๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ ํ๋ ์ด์ ๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ํ์ธ์ ํ๊ธฐ ์ํด์๋ค. ๋ฌด์จ ๋ง์ด๋๋ฉด ๋ง์ฝ 4๊ฐ์ ์นํจ์ง ์ค์์ 2๊ฐ๋ฅผ ์ ํํด์ผ ํ๋ ๊ฒฝ์ฐ์, (1,2), (1,3), (1,4), (2,3), (2,4), (3,4)์ ๊ฐ์ด ์ด 6๊ฐ์ง์ ์กฐํฉ์ ์ ๋ถ ๊ตฌํด์ ์ต์ ์นํจ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
private static void backtracking(int start, int depth) {
// ํ์ถ์กฐ๊ฑด ํ์ฌ ๋ฌธ์ ๋ก ์ต๋์ ์นํจ์ง(M)๊ฐ๋ฅผ ๊ณ์ฐํ๋ฉด ๋ฉ์๋ ์ข
๋ฃ
if (depth == M) {
calculate();
return;
}
for (int i = start; i < chicken.size(); i++) {
isVisited[i] = true;
backtracking(i + 1, depth + 1);
isVisited[i] = false;
}
}
๋ํ ๋ฐ์ calculate() ๋ฉ์๋๋ฅผ ๋ณด๋ฉด ์ฌ๊ธฐ์๋ ๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ ํตํด์ ์ต๋ ์นํจ์ง(M) ๊ฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ต์ ์นํจ๊ฐ์ ๊ณ์ฐํ๋ค. ์ด๊ฒ ๋ง์ด ์ข ์ด์ํํ ์ถ๋ ฅ์ฝ๋๋ฅผ ์ถ๊ฐํด์ ํ์ธํด ๋ณด๋ฉด ๋ ์ฝ๊ฒ ์ดํด๊ฐ ๊ฐ ๊ฒ์ด๋ค.
private static void backtracking(int start, int depth) {
if (depth == M) {
calculate();
// ์ถ๋ ฅ ๋ถ๋ถ
System.out.print("isVisited =");
for(int i = 0; i < isVisited.length ; i++) {
if(isVisited[i]) System.out.print(i + " ");
}
System.out.println();
return;
}
for (int i = start; i < chicken.size(); i++) {
isVisited[i] = true;
backtracking(i + 1, depth + 1);
isVisited[i] = false;
}
}
// ์
๋ ฅ ๊ฐ
5 2
0 2 0 1 0
1 0 1 0 0
0 0 0 0 0
2 0 0 1 1
2 2 0 1 2
// ๊ฒฐ๊ณผ
isVisited = 0 1
isVisited = 0 2
isVisited = 0 3
isVisited = 0 4
isVisited = 1 2
isVisited = 1 3
isVisited = 1 4
isVisited = 2 3
isVisited = 2 4
isVisited = 3 4
์ด๋ ๊ฒ ๋ชจ๋ ์กฐํฉ์ ์ฐพ์๋ณด๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ๋ง์ง๋ง์ผ๋ก ์๋๋ฐฉ์์ ์์ฝํ์๋ฉด ์ด๋ ๊ฒ ์ค๋ช ํ ์ ์์ ๊ฑฐ ๊ฐ๋ค.
- backTracking() ๋ฉ์๋ ์คํ
- for๋ฌธ์ ํตํด ๋ชจ๋ ์นํจ์ง์ ๋ฐฉ๋ฌธํ๋ค / ์ฌ๊ธฐ์ ํฌ์ธํธ๋ ์ต๋ ์นํจ์ง(M)์ ๋ง์ถ๊ธฐ ์ํด depth๋ฅผ + 1 ์ฉ ํด์ค๋ค.
- ๊ทธ๋ ๊ฒ ์ต๋ ์นํจ์ง(M) ๊ฐ๋ฅผ ๋ง์กฑํ๋ depth๊ฐ ๋์๋ค ๊ทธ๋ผ calculate() ๋ฉ์๋ ์คํ
- ํ์ฌ ์ต๋ ์นํจ์ง์ ๊ฐ์(M) ๊ฐ์ ์นํจ์ง์ด ๋ฐฉ๋ฌธ์ฒดํฌ๊ฐ ๋์ด์์ผ๋ฏ๋ก ๋ฐฉ๋ฌธ์ฒดํฌ๊ฐ ๋ ์นํจ์ง๊ณผ ์ง์ ์นํจ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ค.
- ๊ทธ๋ฐ ๋ค์ answer = Math.min(answer, sum)์ ํตํด ์นํจ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์ ํ๋ค.
- ๊ทธ๋ผ ํ์ ์ข ๋ฃ ํ ์ด์ ๋ ธ๋๋ก ๋์๊ฐ 1๋ฒ for๋ฌธ์ผ๋ก ๋ค์ ๋์๊ฐ์ ์คํ
4๊ฐ์ ์นํจ์ง ์ค์ ์ต๋ ์นํจ์ง์ ์๊ฐ 2๋ผ๋ฉด ์ฒ์ 0,1๋ก ๊ณ์ฐํ๊ณ ์ ๊ธฐ์ for ๋ฌธ์ผ๋ก ๋์๊ฐ 0,2๋ก ๊ณ์ฐํ๊ณ ๋ 0,3์ผ๋ก ๊ณ์ฐํ๋ ์์ผ๋ก ์งํ๋๋ค.
๐ ํ์ด ์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class Main {
static int N, M, answer;
static int[][] map;
static boolean[] isVisited;
static List<Point> house, chicken;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
answer = Integer.MAX_VALUE;
map = new int[N][N];
house = new ArrayList<>();
chicken = new ArrayList<>();
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
if (map[i][j] == 1) house.add(new Point(i, j));
if (map[i][j] == 2) chicken.add(new Point(i, j));
}
}
isVisited = new boolean[chicken.size()];
backtracking(0, 0);
System.out.println(answer);
}
private static void backtracking(int start, int depth) {
if (depth == M) {
calculate();
return;
}
for (int i = start; i < chicken.size(); i++) {
isVisited[i] = true;
backtracking(i + 1, depth + 1);
isVisited[i] = false;
}
}
private static void calculate() {
int sum = 0;
for (int i = 0; i < house.size(); i++) {
int temp = Integer.MAX_VALUE;
for (int j = 0; j < chicken.size(); j++) {
if (isVisited[j]) {
int dist = Math.abs(house.get(i).x - chicken.get(j).x)
+ Math.abs(house.get(i).y - chicken.get(j).y);
temp = Math.min(temp, dist);
}
}
sum += temp;
}
answer = Math.min(answer, sum);
}
}
class Point {
int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] 10971๋ฒ: ์ธํ์ ์ํ 2 (1) | 2024.04.10 |
---|---|
[Java] 15664๋ฒ: N๊ณผ M(10) (0) | 2024.03.31 |
[Java] 2023๋ฒ: ์ ๊ธฐํ ์์ (0) | 2024.03.02 |
[Java] 19942๋ฒ: ๋ค์ด์ดํธ (0) | 2024.02.01 |