https://www.acmicpc.net/problem/15686
예전에 풀어봤던 문제인데 다시 풀어보도록 하자.
import java.io.*;
import java.util.*;
public class Main {
public static int N, M, min = Integer.MAX_VALUE, hsize, csize;
public static List<int[]> houses, chickens;
public static int[] alive;
public static int[][] dis;
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());
houses = new ArrayList<>();
chickens = new ArrayList<>();
for(int i = 0; i < N; i++){
st = new StringTokenizer(br.readLine());
for(int j = 0; j < N; j++){
int a = Integer.parseInt(st.nextToken());
if(a == 1) houses.add(new int[] {i, j});
else if(a == 2) chickens.add(new int[] {i, j});
}
}
// 집과 치킨집과의 거리 계산해두기
hsize = houses.size();
csize = chickens.size();
dis = new int[hsize][csize];
int i = 0, j = 0;
for(int[] house : houses){
for(int[] chicken : chickens){
dis[i][j++] = Math.abs(house[0] - chicken[0]) + Math.abs(house[1] - chicken[1]);
}
i++;
j = 0;
}
// 치킨집 조합 선정
alive = new int[M];
dfs(0,0);
System.out.println(min);
}
public static void dfs(int at, int depth){
if(depth == M){
// 치킨거리 최소 계산
int ans = 0;
for(int i = 0; i < hsize; i++){
int chicdis = Integer.MAX_VALUE;
for(int j = 0; j < M; j++){
int cnum = alive[j];
chicdis = Math.min(chicdis, dis[i][cnum]);
}
ans += chicdis;
}
min = Math.min(min, ans);
return;
}
for(int i = at; i < csize; i++){
alive[depth] = i;
dfs(i + 1, depth + 1);
}
}
}
'코딩테스트 > JAVA' 카테고리의 다른 글
| [프로그래머스 JAVA] Lv.1 개인정보 수집 유효기간 (0) | 2025.10.08 |
|---|---|
| [백준 JAVA] 17144번: 미세먼지 안녕! (0) | 2025.10.02 |
| [백준 JAVA] 14719번: 빗물 (0) | 2025.10.02 |
| [백준 JAVA] 14503번: 로봇 청소기 (0) | 2025.10.01 |
| [백준 JAVA] 12865번: 평범한 배낭 (0) | 2025.10.01 |