728x90
반응형
문제
https://www.acmicpc.net/problem/15686
풀이 방법
문제를 보고서 어떤식으로 문제를 풀어야할 지 순서를 생각해봤다.
1. 우선 치킨집에서 어떤 치킨집을 남겨둘 것인지에 대한 조합 만들기
2. 골라진 치킨집들을 가지고 치킨거리를 구하기
3. 치킨 거리를 구하면서 최소값 저장하기
순서로 구현했다.
제출 코드
import java.io.*;
import java.util.*;
public class BJ_15686_치킨배달 {
public static int N, M, minDist;
public static int[] chickenDist;
public static int[][] map;
public static int[][] selectChicken;
public static List<int[]> chickens;
public static List<int[]> homes;
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 + 1][N + 1];
chickens = new ArrayList<>(); // 치킨 집 리스트
homes = new ArrayList<>(); // 집 리스트
selectChicken = new int[M][2]; // 고른 치킨집 리스트
for (int i = 1; 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)
homes.add(new int[] { i, j }); // 집 리스트에 넣어주기
else if (map[i][j] == 2)
chickens.add(new int[] { i, j }); // 치킨집리스트에 넣어주기
}
}
chickenDist = new int[homes.size()]; // 각 집마다 치킨거리 저장할 변수
minDist = Integer.MAX_VALUE;
combination(0, 0); // 조합 시작
System.out.println(minDist);
}
private static void combination(int cnt, int start) {
if (cnt == M) { // 기저 조건
// 각 집마다 치킨 거리 구하러가기
calcDist(selectChicken);
int sum = 0;
for (int i = 0; i < homes.size(); i++) { //각 치킨 거리의 합
sum += chickenDist[i];
}
minDist = Math.min(sum, minDist); //최소값으로
return;
}
for (int i = start; i < chickens.size(); i++) {
selectChicken[cnt] = chickens.get(i);
combination(cnt + 1, i + 1);
}
}
private static void calcDist(int[][] sc) {
for (int i = 0; i < homes.size(); i++) { // 각 집마다 치킨 거리 구하기
int min = Integer.MAX_VALUE;
for (int j = 0; j < M; j++) {
int dist = Math.abs(homes.get(i)[0] - sc[j][0]) + Math.abs(homes.get(i)[1] - sc[j][1]);
min = Math.min(dist, min); //치킨집과 집 사이에 가장 최단거리를 저장
}
chickenDist[i] = min; //치킨 거리 저장
}
}
}
728x90
반응형
'알고리즘 > BJ' 카테고리의 다른 글
[BJ] 백준 10163 색종이(JAVA) (0) | 2022.03.08 |
---|---|
[BJ] 백준 2628 종이자르기 (JAVA) (0) | 2022.03.07 |
[BJ] 백준 2635 수 이어가기 (JAVA) (1) | 2022.03.02 |
[BJ] 백준 2304 창고 다각형 (JAVA) (0) | 2022.03.01 |
[BJ] 백준 15683 감시 (JAVA) (0) | 2022.02.28 |