๐ก Info
๋ด์ฉ
ํฌ๊ธฐ๊ฐ NรN์ธ ๋์๊ฐ ์๋ค. ๋์๋ 1ร1ํฌ๊ธฐ์ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ๋์์ ๊ฐ ์นธ์ ๋น ์นธ, ์นํจ์ง, ์ง ์ค ํ๋์ด๋ค. ๋์์ ์นธ์ (r, c)์ ๊ฐ์ ํํ๋ก ๋ํ๋ด๊ณ , rํ c์ด ๋๋ ์์์๋ถํฐ r๋ฒ์งธ ์นธ, ์ผ์ชฝ์์๋ถํฐ c๋ฒ์งธ ์นธ์ ์๋ฏธํ๋ค. r๊ณผ c๋ 1๋ถํฐ ์์ํ๋ค.
์ด ๋์์ ์ฌ๋ ์ฌ๋๋ค์ ์นํจ์ ๋งค์ฐ ์ข์ํ๋ค. ๋ฐ๋ผ์, ์ฌ๋๋ค์ "์นํจ ๊ฑฐ๋ฆฌ"๋ผ๋ ๋ง์ ์ฃผ๋ก ์ฌ์ฉํ๋ค. ์นํจ ๊ฑฐ๋ฆฌ๋ ์ง๊ณผ ๊ฐ์ฅ ๊ฐ๊น์ด ์นํจ์ง ์ฌ์ด์ ๊ฑฐ๋ฆฌ์ด๋ค. ์ฆ, ์นํจ ๊ฑฐ๋ฆฌ๋ ์ง์ ๊ธฐ์ค์ผ๋ก ์ ํด์ง๋ฉฐ, ๊ฐ๊ฐ์ ์ง์ ์นํจ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ๋์์ ์นํจ ๊ฑฐ๋ฆฌ๋ ๋ชจ๋ ์ง์ ์นํจ ๊ฑฐ๋ฆฌ์ ํฉ์ด๋ค.
์์์ ๋ ์นธ (r1, c1)๊ณผ (r2, c2) ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ |r1-r2| + |c1-c2|๋ก ๊ตฌํ๋ค.
์๋ฅผ ๋ค์ด, ์๋์ ๊ฐ์ ์ง๋๋ฅผ ๊ฐ๋ ๋์๋ฅผ ์ดํด๋ณด์.
0์ ๋น ์นธ, 1์ ์ง, 2๋ ์นํจ์ง์ด๋ค.
(2, 1)์ ์๋ ์ง๊ณผ (1, 2)์ ์๋ ์นํจ์ง๊ณผ์ ๊ฑฐ๋ฆฌ๋ |2-1| + |1-2| = 2, (5, 5)์ ์๋ ์นํจ์ง๊ณผ์ ๊ฑฐ๋ฆฌ๋ |2-5| + |1-5| = 7์ด๋ค. ๋ฐ๋ผ์, (2, 1)์ ์๋ ์ง์ ์นํจ ๊ฑฐ๋ฆฌ๋ 2์ด๋ค.
(5, 4)์ ์๋ ์ง๊ณผ (1, 2)์ ์๋ ์นํจ์ง๊ณผ์ ๊ฑฐ๋ฆฌ๋ |5-1| + |4-2| = 6, (5, 5)์ ์๋ ์นํจ์ง๊ณผ์ ๊ฑฐ๋ฆฌ๋ |5-5| + |4-5| = 1์ด๋ค. ๋ฐ๋ผ์, (5, 4)์ ์๋ ์ง์ ์นํจ ๊ฑฐ๋ฆฌ๋ 1์ด๋ค.
์ด ๋์์ ์๋ ์นํจ์ง์ ๋ชจ๋ ๊ฐ์ ํ๋์ฐจ์ด์ฆ์ด๋ค. ํ๋ ์ฐจ์ด์ฆ ๋ณธ์ฌ์์๋ ์์ต์ ์ฆ๊ฐ์ํค๊ธฐ ์ํด ์ผ๋ถ ์นํจ์ง์ ํ์ ์ํค๋ ค๊ณ ํ๋ค. ์ค๋ ์ฐ๊ตฌ ๋์ ์ด ๋์์์ ๊ฐ์ฅ ์์ต์ ๋ง์ด ๋ผ ์ ์๋ ์นํจ์ง์ ๊ฐ์๋ ์ต๋ M๊ฐ๋ผ๋ ์ฌ์ค์ ์์๋ด์๋ค.
๋์์ ์๋ ์นํจ์ง ์ค์์ ์ต๋ M๊ฐ๋ฅผ ๊ณ ๋ฅด๊ณ , ๋๋จธ์ง ์นํจ์ง์ ๋ชจ๋ ํ์ ์์ผ์ผ ํ๋ค. ์ด๋ป๊ฒ ๊ณ ๋ฅด๋ฉด, ๋์์ ์นํจ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์๊ฒ ๋ ์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
๐ฅ์ ๋ ฅ ์กฐ๊ฑด
//์1
5 3
0 0 1 0 0
0 0 2 0 1
0 1 2 0 0
0 0 1 0 0
0 0 0 0 2
//์2
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
//์3
5 1
1 2 0 0 0
1 2 0 0 0
1 2 0 0 0
1 2 0 0 0
1 2 0 0 0
//์4
5 1
1 2 0 2 1
1 2 0 2 1
1 2 0 2 1
1 2 0 2 1
1 2 0 2 1
๐ค์ถ๋ ฅ ์กฐ๊ฑด
//์1
5
//์2
10
//์3
11
//์4
32
์ค์ ํ์ด ์๊ฐ : 35๋ถ
import java.util.*;
public class Main {
static int N = 0;
static int M = 0;
static ArrayList<int[]> house = new ArrayList<>(); //์ง
static ArrayList<int[]> chicken = new ArrayList<>(); //์นํจ
static int result = Integer.MAX_VALUE;
static boolean[] chick;
public static void main(String[] args){
/*
- ๋์์ ์นํจ ๊ฑฐ๋ฆฌ์ ์ต์๊ฐ, ์ฆ ๋ชจ๋ ์ง์ ์นํจ ๊ฑฐ๋ฆฌ์ ํฉ ์ค ์ต์๊ฐ์ ์ถ๋ ฅํ๊ธฐ
*/
Scanner sc = new Scanner(System.in);
// 1. N๊ณผ M ์
๋ ฅ๋ฐ๊ธฐ(N = ์
๋ ฅ๋ฐ์ ์ค ์, M = ํ์
์ํค์ง ์์ ์นํจ์ง์ ์ต๋ ๊ฐ์)
int N = sc.nextInt();
int M = sc.nextInt();
// 2. N๊ฐ์ ์ค ์
๋ ฅ๋ฐ๊ธฐ -> ์ง, ์นํจ์ง ์ ๋ณด
ArrayList<int[]> house = new ArrayList<>(); //์ง
ArrayList<int[]> chicken = new ArrayList<>(); //์นํจ
for(int r=0; r<N; r++){
for(int c=0; c<N; c++){
switch(sc.nextInt()){
case 1 : //1์ ์ง
house.add(new int[]{r,c});
break;
case 2 : //2๋ ์นํจ์ง
chicken.add(new int[]{r,c});
break;
}
}
}
combination(-1,0);
System.out.println(result);
}
// 3. ์นํจ ๊ฑฐ๋ฆฌ ๊ตฌํ๊ธฐ : ์ง๊ณผ ๊ฐ์ฅ ๊ฐ๊น์ด ์นํจ์ง ์ฌ์ด์ ๊ฑฐ๋ฆฌ
// ๋์์ ์นํจ ๊ฑฐ๋ฆฌ ๊ตฌํ๊ธฐ : ๋ชจ๋ ์ง์ ์นํจ ๊ฑฐ๋ฆฌ์ ํฉ
public static void combination(int n, int r){
if(r == M){
int dist = 0;
for (int i = 0; i < house.size(); i++) {
int tmp = Integer.MAX_VALUE;
for (int j = 0; j < chicken.size(); j++) {
if (chick[j]) {
int[] h = house.get(i);
int[] c = chicken.get(j);
tmp = Math.min(tmp, Math.abs(h[0] - c[0]) + Math.abs(h[1] - c[1]));
}
}
dist += tmp;
}
result = Math.min(result, dist);
return;
}
}
}
static int N;
static int M;
static ArrayList<int[]> house; //์ง
static ArrayList<int[]> chicken; //์นํจ
static int result = Integer.MAX_VALUE;
static boolean[] chick;
์ค์ ํ์ด ์๊ฐ : 67๋ถ(์ฒซ ํ์ด ์๊ฐ ํฌํจ)
์ ๋ ฅ
์ถ๋ ฅ
๋ณ๋ ๋ฉ์๋
import java.util.*;
public class Main {
static int N;
static int M;
static ArrayList<int[]> house; //์ง
static ArrayList<int[]> chicken; //์นํจ
static int result = Integer.MAX_VALUE;
static boolean[] chick;
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
// 1. N๊ณผ M ์
๋ ฅ๋ฐ๊ธฐ(N = ์
๋ ฅ๋ฐ์ ์ค ์, M = ํ์
์ํค์ง ์์ ์นํจ์ง์ ์ต๋ ๊ฐ์)
N = sc.nextInt();
M = sc.nextInt();
// 2. N๊ฐ์ ์ค ์
๋ ฅ๋ฐ๊ธฐ -> ์ง, ์นํจ์ง ์ ๋ณด
house = new ArrayList<>(); //์ง
chicken = new ArrayList<>(); //์นํจ
for(int r=0; r<N; r++){
for(int c=0; c<N; c++){
switch(sc.nextInt()){
case 1 : //1์ ์ง
house.add(new int[]{r,c});
break;
case 2 : //2๋ ์นํจ์ง
chicken.add(new int[]{r,c});
break;
}
}
}
chick = new boolean[chicken.size()];
combination(0,0);
System.out.println(result);
}
// 3. ์นํจ ๊ฑฐ๋ฆฌ ๊ตฌํ๊ธฐ : ์ง๊ณผ ๊ฐ์ฅ ๊ฐ๊น์ด ์นํจ์ง ์ฌ์ด์ ๊ฑฐ๋ฆฌ
// ๋์์ ์นํจ ๊ฑฐ๋ฆฌ ๊ตฌํ๊ธฐ : ๋ชจ๋ ์ง์ ์นํจ ๊ฑฐ๋ฆฌ์ ํฉ
public static void combination(int n, int r){
if(r == M){
int dist = 0;
for (int i = 0; i < house.size(); i++) {
int tmp = Integer.MAX_VALUE;
for (int j = 0; j < chicken.size(); j++) {
if (chick[j]) {
int[] h = house.get(i);
int[] c = chicken.get(j);
tmp = Math.min(tmp, Math.abs(h[0] - c[0]) + Math.abs(h[1] - c[1]));
}
}
dist += tmp;
}
result = Math.min(result, dist);
return;
}
for (int i = n; i < chick.length; i++) {
chick[i] = true;
combination(i+1, r + 1);
chick[i] = false;
}
}
}