https://www.acmicpc.net/problem/15686
์ผ๋ ์ ์ ์๊ณ ๋ฆฌ์ฆ ์คํฐ๋ํ ๋ ํ์ด๋ดค๋ ๋ฌธ์ ์ด๋ค. ๊ทธ๋๋ ๋ชป ํ์ด์ ํด์ค์ ์ฐธ๊ณ ํด์ ํ์๋๋ฐ, ์ด๋ฒ์๋ ํด์ค์ ์ฐธ๊ณ ํ์ง ์๊ณ ์จ์ ํ ๋ด ํ์ผ๋ก ํ์๋ค. ์ค๋ ฅ์ด ๋ ๊ฑฐ ๊ฐ์์ ๋ฟ๋ฏํ๋ค!
๋์์ ์๋ ์นํจ์ง ์ค์์ ์ต๋ M๊ฐ๋ฅผ ๊ณ ๋ฅด๊ณ , ๋๋จธ์ง ์นํจ์ง์ ๋ชจ๋ ํ์ ์์ผ์ผ ํ๋ค.
1. ๋ฐฐ์ด์ ์ ๋ณด๋ฅผ ์ ๋ ฅ๋ฐ์ ๋, ์นํจ์ง์ ์ขํ๋ฅผ ํด๋์ค๋ก ์์ฑ๋ ๊ฐ์ฒด์ ๋ฆฌ์คํธ๋ก ์ ์ฅํ๋ค
2. ๋ฆฌ์คํธ์ ์ ์ฅ๋ ์นํจ์ง ์ค M๊ฐ๋ฅผ ์กฐํฉ์ ํตํด ๋ฝ๋๋ค. ์ด๋ 0๊ฐ๋ถํฐ M๊ฐ ์กฐํฉ ๋ชจ๋์ ๋ํด ์กฐํฉ์ ์ค์ํ๋ค.
3. ์ฃผ์ด์ง ์๋งํผ ๋ค ๋ฝ์์ผ๋ฉด, ์ ํ๋ ์นํจ์ง์ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์นํจ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ค.
- ํ ์ง์ ๋ํด ์ ํ๋ ๋ชจ๋ ์นํจ ์ง๊ณผ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด ๊ฐ์ฅ ๊ฐ๊น์ด ์นํจ์ง ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ค.
- ๋ชจ๋ ์ง์ ์นํจ๊ฑฐ๋ฆฌ๋ฅผ ๋ํ๋ค
4. ์ต์๊ฐ์ ๊ฐ์ ๊ฐฑ์ ํ๋ค.
์๊ฐํด๋ณด๋ ์กฐํฉ ์๊ณ ๋ฆฌ์ฆ์ visited ๋ฐฐ์ด์ด ํ์์๋ค. ๊ทธ๋์ visited ์ฒดํฌ๋ฅผ ํ ํ์๊ฐ ์๋ค. ํ์ง๋ง ๋ฐฉ๋ฌธํ ๊ณณ์ ์ธ๋ฑ์ค๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ์ ๋ณด๋ก๋ ์ผ๋ค.
์ฝ๋
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;
static List<Dot> chickenList;
static List<Dot> houseList;
static boolean[] visited;
static int min = Integer.MAX_VALUE;
static class Dot {
int x;
int y;
public Dot(int x, int y) {
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());
chickenList = new ArrayList<>();
houseList = new ArrayList<>();
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < N; j++) {
int value = Integer.parseInt(st.nextToken());
if(value == 1) {
houseList.add(new Dot(i, j));
}else if(value == 2) {
chickenList.add(new Dot(i, j));
}
}
}
// ๊ตฌํ
visited = new boolean[chickenList.size()];
for (int i = 1; i <= M; i++) { // 1, 2, .., M๊ฐ ์กฐํฉ
combination(0, 0, i);
}
// ์ถ๋ ฅ
System.out.println(min);
}
public static void combination(int start, int depth, int m) {
if (depth == m) {
min = Math.min(min, getDistance());
return;
}
for(int i = start; i < chickenList.size(); i++) {
if (visited[i]) continue;
visited[i] = true;
combination(i + 1, depth + 1, m);
visited[i] = false;
}
}
public static int getDistance() {
int distanceSum = 0;
for(Dot house : houseList) {
int dMin = Integer.MAX_VALUE;
for(int i = 0; i < chickenList.size(); i++) {
if(visited[i]) { //์ด์๋จ์ ์นํจ์ง์ด๋ฉด
Dot chicken = chickenList.get(i);
int d = Math.abs(house.x - chicken.x) + Math.abs(house.y - chicken.y);
dMin = Math.min(dMin, d);
}
}
distanceSum += dMin;
}
return distanceSum;
}
}
๊ฒฐ๊ณผ
'Algorithm > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค 2839๋ฒ - ์คํ ๋ฐฐ๋ฌ (0) | 2022.08.21 |
---|---|
๋ฐฑ์ค 1193๋ฒ - ๋ถ์์ฐพ๊ธฐ (0) | 2022.08.21 |
๋ฐฑ์ค 1987๋ฒ - ์ํ๋ฒณ (0) | 2022.08.18 |
14889๋ฒ - ์คํํธ์ ๋งํฌ (0) | 2022.08.16 |
๋ฐฑ์ค 2961๋ฒ - ๋์์ด๊ฐ ๋ง๋ ๋ง์๋ ์์ (0) | 2022.08.16 |