https://www.acmicpc.net/problem/15686
15686๋ฒ: ์นํจ ๋ฐฐ๋ฌ
ํฌ๊ธฐ๊ฐ N×N์ธ ๋์๊ฐ ์๋ค. ๋์๋ 1×1ํฌ๊ธฐ์ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ๋์์ ๊ฐ ์นธ์ ๋น ์นธ, ์นํจ์ง, ์ง ์ค ํ๋์ด๋ค. ๋์์ ์นธ์ (r, c)์ ๊ฐ์ ํํ๋ก ๋ํ๋ด๊ณ , rํ c์ด ๋๋ ์์์๋ถํฐ r๋ฒ์งธ ์นธ
www.acmicpc.net
1. ๋ฌธ์ ์์ฝ
NxN ํฌ๊ธฐ์ ๋์์ ์นํจ์ง, ์ง์ด ์๋ค. ์ง์์ ์นํจ์ง๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ '์นํจ๊ฑฐ๋ฆฌ'๋ผ๊ณ ํ๋ค.
์นํจ์ง ์ ์ฒด ์ ์ค M๊ฐ๋ฅผ ์ ํํ์ฌ ๊ฐ๊ฐ์ ์ง์ ๋ํ์ฌ ์ต์๊ฐ ๋๋ ์นํจ๊ฑฐ๋ฆฌ์ ํฉ์ ๊ตฌํ์ฌ ์ถ๋ ฅํ๋ ๋ฌธ์ ๋ค.
๊ฐ๊ฐ์ ์ง๋ง๋ค ์ต์๊ฐ ๋๋ ์นํจ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๊ณ , ์ด๋ฅผ ๋ชจ๋ ํฉํ๋ฉด ๋๋ค.
๊ฑฐ๋ฆฌ๋ (a,b) (c,d) ๋ ์นธ์ ์๋ก๋ค๋ฉด |a-b| + |c-d| ๋ก ๊ตฌํ๋ค. (๋งจํํ ๊ฑฐ๋ฆฌ ๊ณต์)
0 : ๋น์นธ
1 : ์ง
2 : ์นํจ์ง
์ ์ฝ์กฐ๊ฑด์ (M <= ์นํจ์ง <= 13), (2 <= N <= 50), (์ง <= 2N) ์ด๋ค.
2. ํ์ด
์กฐํฉ + ๊ตฌํ ๋ฌธ์ ์ด๋ค.
1. ์ ๋ ฅ
๋จผ์ ์ ๋ ฅ๋ฐ์ ๋ ์ขํ ๊ฐ์ด 1์ด๋ฉด ์ง, 2์ด๋ฉด ์นํจ์ง ArrayList์ ๊ฐ๊ฐ add ํด์ฃผ์๋ค.
(๊ทธ ์ ์, x,y ์ขํ๋ฅผ ๋ด๋ Posํด๋์ค๋ฅผ ์์ฑํ์ฌ ArrayList๋ฅผ Pos์ผ๋ก ์์ฑํด์ฃผ์๋ค.)
2. ์นํจ์ง ์ ํ ๋ฐ ์นํจ ๊ฑฐ๋ฆฌ ๊ตฌํ๊ธฐ
๊ทธ ๋ค์ ์นํจ์ง M๊ณณ์ ์ ํํด์ฃผ๊ธฐ ์ํด ์กฐํฉ์ ์ฌ์ฉํ์๋ค.
์กฐํฉ ํจ์ comb์ ๊ธฐ์ ์กฐ๊ฑด์์ check() ํจ์๋ฅผ ๋ง๋ค์ด ์นํจ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๊ณ , min์ ๊ฐฑ์ ํ์๋ค.
๋ด๊ฐ ๋์น ๋ถ๋ถ์ 3๊ตฐ๋ฐ์ด๋ค.
1) ํ๋์ ์ง ๋น M๊ฐ ์นํจ์ง๊ณผ์ ๊ฑฐ๋ฆฌ ์ค ์ต์๊ฐ ๋๋ ๊ฑฐ๋ฆฌ๊ฐ ์นํจ๊ฑฐ๋ฆฌ๊ฐ ๋๋ค๋ ๊ฒ
- ํ๋์ ์ง ๋น M๊ฐ ์นํจ์ง๊ณผ์ ๊ฑฐ๋ฆฌ์ ํฉ์ ๋น๊ตํด์ฃผ๊ณ ์์๋ค. '์ต์๊ฐ ๋๋ ๊ฑฐ๋ฆฌ'๋ฅผ ๋์ณค๋ค.
2) ํ๋์ ์ง ๋น ์ต์ ์นํจ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด์ฃผ์ด์ผ ํ๋ฏ๋ก, min ์ด๊ธฐํ๊ฐ ํ๋์ ์ง for๋ฌธ ์์์ ์ด๊ธฐํ๋ผ์ผ ํ๋ค๋ ๊ฒ
- min์ for๋ฌธ ๋ฐ์์ ์ด๊ธฐํํด์ค์ ๋ค๋ฅธ์ง์ min๊ณผ๋ ๊ณ์ ๋น๊ตํ๋ฉด์ sum์ ๊ตฌํ๊ณ ์์๋ค.
3) ์นํจ์ง M๊ฐ๋ฅผ ๋ฝ๋๋ฐ 2๊ฐ๋ฅผ ๋ฝ๊ณ ์์๋ ๊ฒ..
๋ฌธ์ ๋ฅผ ํ๋ฒ๋ง ์ฝ๊ณ ๋ ์ดํดํ ์ ์์๋ค. ์๊พธ ํ๋์ฉ ๋์ณ์ 4๋ฒ์ ์ฝ์ ๊ฒ ๊ฐ๋ค.
3. ๋ฌธ์ ์
์นํจ ๊ฑฐ๋ฆฌ์ mix๋ฅผ ๊ฐฑ์ ํ๋ ๋ถ๋ถ์์ ๊ฐ์ฅ ํท๊ฐ๋ ธ๋ค.
์ฒ์์๋ M = 2๋ก ๋ฐ์๋๊ณ ์กฐํฉ์ ๋๋ ค์ ์๊พธ ์ด์ํ ๋ต์ด ๋์๋ค.
M์ผ๋ก ๋ฐ๊พธ๊ณ M๊ฐ์ ์นํจ์ง๊ณผ ๋น๊ตํด์ฃผ๋ ๋ต์ด ์ ๋์๋ค.
4. ์ฝ๋
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class BOJ_15686_์นํจ๋ฐฐ๋ฌ {
static int N, M, min, size;
static int[] tgt;
static int[][] map;
static List<Pos> home = new ArrayList<> ();
static List<Pos> chicken = new ArrayList<> ();
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
tgt = new int[M];
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] == 1) home.add(new Pos(i, j)); //์ง ์ขํ add
if (map[i][j] == 2) chicken.add(new Pos(i, j)); //์นํจ์ง ์ขํ add
}
}
size = chicken.size(); //์นํจ์ง ๊ฐ์
//์
๋ ฅ ๋
//ํ์ - ์กฐํฉ
min = Integer.MAX_VALUE;
comb(0, 0);
System.out.println(min);
}
static void comb(int tgtIdx, int srcIdx) {
if (tgtIdx == M) { //์นํจ์ง 2๊ณณ ์ ํ
check(); //์นํจ๊ฑฐ๋ฆฌ ๊ตฌํ๊ณ min ๊ฐฑ์
return;
}
if (srcIdx == size) return;
tgt[tgtIdx] = srcIdx;
comb(tgtIdx+1, srcIdx+1);
comb(tgtIdx, srcIdx+1);
}
static void check() { //์นํจ๊ฑฐ๋ฆฌ
int sum = 0;
for (Pos h : home) {
int min_dist = Integer.MAX_VALUE; //for๋ฌธ ๋ฐ์ ๋ฃ์ด์ฃผ๋ฉด ๋ค๋ฅธ์ง๊ณผ์ ์ต์๊ฑฐ๋ฆฌ๋ ๋น๊ตํ๊ฒ ๋จ
for (int i = 0; i < M; i++) { //M๊ฐ ์นํจ์ง ์ค ๊ฐ์ฅ ์ต์๊ฑฐ๋ฆฌ ์นํจ์ง ์ฐพ๊ธฐ
int dist = Math.abs(chicken.get(tgt[i]).y - h.y) + Math.abs(chicken.get(tgt[i]).x - h.x);
min_dist = Math.min(dist, min_dist);
}
sum += min_dist; //๊ทธ ์ง์ ์ต์ ๊ฑฐ๋ฆฌ๋ง ํฉํด์ค
}
min = Math.min(sum, min); //์ ์ฒด ์กฐํฉ ์ค ์ต์๊ฐ ๊ฐฑ์
}
static class Pos {
int y, x;
public Pos(int y, int x) {
this.y = y;
this.x = x;
}
}
}
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 2644 ์ด์๊ณ์ฐ (Java) (0) | 2022.09.11 |
---|---|
[BOJ] 2193 ์ด์น์ (Java) (0) | 2022.09.06 |
[BOJ] 16637 ๊ดํธ์ถ๊ฐํ๊ธฐ [Java] (0) | 2022.08.28 |
[BOJ] 1697 ์จ๋ฐ๊ผญ์ง [Java] (0) | 2022.08.25 |
[BOJ] 2606 ๋ฐ์ด๋ฌ์ค [Java] (0) | 2022.08.25 |