(1회차 실패 코드)
import java.io.*;
import java.util.*;
public class Main {
static int[][] arr;
static ArrayList<int[]> chick;
static ArrayList<int[]> city;
static int ans = Integer.MAX_VALUE;
static boolean[] visited;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
arr = new int[n][n];
chick = new ArrayList<>();
city = new ArrayList<>();
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < n; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
if(arr[i][j] == 1){
city.add(new int[]{i,j});
}else if(arr[i][j] == 2){
chick.add(new int[]{i,j});
}
}
}
visited = new boolean[chick.size()];
backtracking(n,m,0);
bw.write(ans+"");
br.close();
bw.close();
}
private static void backtracking(int n, int m, int depth) {
if(depth == m){
int sum = 0;
for (int i = 0; i < city.size(); i++) {
int min = Integer.MAX_VALUE;
for (int j = 0; j < chick.size(); j++) {
if(visited[j]){
min = Math.min(min, Math.abs(chick.get(j)[0] - city.get(i)[0]) + Math.abs(chick.get(j)[1] - city.get(i)[1]));
}
}
sum += min;
}
ans = Math.min(ans, sum);
return;
}
for (int i = 0; i < chick.size(); i++) {
if(!visited[i]){
visited[i] = true;
backtracking(n,m,depth+1);
visited[i] = false;
}
}
}
}
(2회차 정답 코드)
import java.io.*;
import java.util.*;
public class Main {
static ArrayList<int[]> chick;
static ArrayList<int[]> city;
static int ans = Integer.MAX_VALUE;
static boolean[] visited;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
chick = new ArrayList<>();
city = 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){
city.add(new int[]{i,j});
}else if(a == 2){
chick.add(new int[]{i,j});
}
}
}
visited = new boolean[chick.size()];
backtracking(n,m,0, 0);
bw.write(ans+"");
br.close();
bw.close();
}
private static void backtracking(int n, int m, int depth, int start) {
if(depth == m){
int sum = 0;
for (int i = 0; i < city.size(); i++) {
int min = Integer.MAX_VALUE;
for (int j = 0; j < chick.size(); j++) {
if(visited[j]){
min = Math.min(min, Math.abs(chick.get(j)[0] - city.get(i)[0]) + Math.abs(chick.get(j)[1] - city.get(i)[1]));
}
}
sum += min;
}
ans = Math.min(ans, sum);
return;
}
for (int i = start; i < chick.size(); i++) {
if(!visited[i]){
visited[i] = true;
backtracking(n,m,depth+1, i+1);
visited[i] = false;
}
}
}
}