๐พ ์๊ณ ๋ฆฌ์ฆ
- ์กฐํฉ์ผ๋ก ํ์ ํ ์นํจ์ง๊ณผ ์ด์ํ๋ ์นํจ์ง์ ๋ถ๋ฅํ๋ค. ์คํ๋ ์นํจ์ง M๊ฐ๋ฅผ ๊ณจ๋ผ ๊ทธ ์ค์์ ์นํจ ๊ฑฐ๋ฆฌ๊ฐ ์ต์์ธ ๊ฒฝ์ฐ๋ฅผ ๊ตฌํ๋ค.
๐พ ์๊ฐ ํฌ์ธํธ
- Point class๋ฅผ ์ ์ธํด์ ์ขํ๋ฅผ ๋ฌถ์์ผ๋ก ๊ฐ์ง๊ณ ๋ค๋๊ฑฐ๋, ๊ทธ ๋ฌถ์์์ x, y ์ขํ๋ฅผ ์ถ์ถํ ์ ์๋ค.
- ๋ณ์๊ฐ ์ฌ๋ฌ๊ฐ ๋ฑ์ฅํ๋ฏ๋ก ํท๊ฐ๋ฆด ์ ์์ผ๋ ์ฃผ์ํ ๊ฒ!
- ์ ๋ ฅ๋ฐ์ ๋, 2์ ๊ฐ์ ๊ฐ์ง๋ ์ขํ๋ฅผ ์นํจ์ง์ผ๋ก ์ ์ฅํ๋ค. (class์ ์ขํ ์ ์ฅ)
- ์คํํ ์นํจ์ง์ M๊ฐ ์ ํํด์ผ ํ๋ฏ๋ก, ์ฌ๊ท๋ฅผ ์ด์ฉํ ์กฐํฉ๋ก ์ ํ์ฉํด M๊ฐ๊ฐ ๋๋ฉด ์นํจ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
- ์ฒ์์ ์ ์ฅํ ์นํจ์ง์ ์ขํ๋ฅผ ๋ค์ Class ์์ ๊บผ๋ด์ค๋ค. ์ด๋, int chicken์ด ์๋ Point(ํด๋์ค๋ช ) chicken์ผ๋ก ํ์ฌ, ์ฆ, ํด๋์ค๋ช ์ ํ์ ์ผ๋ก ํ์ฌ ๊ฐ์ ๋ฐํํ ์ ์๋๋ก ํ๋ค.
๐พ ์์ค์ฝ๋
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[][] map;
static int N;
static int M;
static List<Point> chickenhome = new ArrayList<>();
static int min = Integer.MAX_VALUE;
static int[] finalopen;
static class Point {
int x;
int y;
public Point(int x, int y) {
super();
this.x = x;
this.y = y;
}
}
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());
map = new int[N][N];
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] == 2) {
chickenhome.add(new Point(i, j));
}
}
} // ์
๋ ฅ์
/* ์นํจ์ง์ค์์ 1๊ฐ๋ง ์ ํํ ๊ฒฝ์ฐ, 2๊ฐ๋ง ์ ํํ ๊ฒฝ์ฐ ๋ฑ๋ฑ ํด์ ์นํจ ๊ฑฐ๋ฆฌ๊ณ์ ๊ตฌํ๊ธฐ */
finalopen = new int[M];
isOpen(0, 0);
System.out.println(min);
}
// ๊ณ์ ์คํํด ์๋ ์ ๋ค ๊ฒฐ์ ํ๊ธฐ
private static void isOpen(int count, int idx) {
// ๊ธฐ์
if (count == M) {
min = Math.min(min, calc_dist());
return;
}
// ์ฌ๊ท
for (int i = idx; i < chickenhome.size(); i++) {
finalopen[count] = i;
isOpen(count + 1, i + 1);
}
}
// ์คํํ m๊ฐ์ ๊ฐ๊ฒ ๊ณจ๋์ผ๋ฉด ๊ทธ ๋ ์นํจ๊ฑฐ๋ฆฌ ๊ตฌํ์.
private static int calc_dist() {
int sum = 0;
for (int r = 0; r < N; r++) {
for (int c = 0; c < N; c++) {
if (map[r][c] == 1) {
int minlen = Integer.MAX_VALUE;
for (int k = 0; k < M; k++) {
Point chicken = chickenhome.get(finalopen[k]);
int d = Math.abs(r - chicken.x) + Math.abs(c - chicken.y);
minlen = Math.min(minlen, d);
}
sum += minlen;
}
}
}
return sum;
}
}
๐ต๐ซ ๊ณต๋ถํด์ผ ํ ์
- ์์ง class ๋ฅผ ๋ค๋ฃจ๋ ๊ฒ ์ต์ํ์ง ์๋ค!
- ์กฐํฉ๊ณผ ์์ด, ๋ถ๋ถ์งํฉ ๊ณต๋ถํ๊ธฐ !!
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ_7576] ํ ๋งํ (๊ณจ๋ 5) - JAVA (1) | 2023.10.11 |
---|---|
[BOJ_2468] ์์ ์์ญ (์ค๋ฒ 1) (2) | 2023.10.09 |
[์๊ณ ๋ฆฌ์ฆ]์ ๋ ฌ (3) | 2023.08.13 |
[์๊ณ ๋ฆฌ์ฆ]SWEA_11315. ์ค๋ชฉ ํ์ (0) | 2023.08.13 |
[์๊ณ ๋ฆฌ์ฆ]SWEA_1954.๋ฌํฝ์ด์ซ์ (0) | 2023.08.12 |