작성
·
455
0
안녕하세요. 좋은 강의 만들어주셔서 덕분에 알고리즘 공부를 수월하게 하고 있습니다.
다름이 아니라, 문제 풀이하는 방법은 강의와 유사하게 하였습니다.
저는 DFS를 활용할 때 선택된 피자가게의 index가 아닌, 객체 자체를 selected 배열에 넣는 방식으로 진행하였습니다. 예제와 똑같은 출력값이 나왔으나, 시간 초과라고 하여서 강의와 아예 똑같은 코드를 쳐봐도 시간초과라고 나옵니다.
아래에 첨부한 코드는 초반에 제가 입력한 코드인데, 어느 부분에서 시간초과가 나는 건지 알려주실 수 있을까요?
class Dis{
public int x, y;
public Dis(int x, int y){
this.x = x;
this.y = y;
}
}
public class Code27 {
public static int n, m;
public static int min = Integer.MAX_VALUE;
public static ArrayList<Dis> house, pizza;
public static Dis[] selected;
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
house = new ArrayList<>();
pizza = new ArrayList<>();
selected = new Dis[m];
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
int location = sc.nextInt();
if(location==1) house.add(new Dis(i, j));
else if(location==2) pizza.add(new Dis(i, j));
}
}
DFS(0,0);
System.out.println(min);
}
public static void DFS(int L, int start){
if(L==m){
min = Math.min(min, distCalc(selected));
}else{
for(int i=start; i<pizza.size(); i++){
selected[L] = pizza.get(i);
DFS(L+1, start+1);
}
}
}
public static int distCalc(Dis[] selected){
int sum = 0;
for(Dis h : house){
int dis = Integer.MAX_VALUE;
for(int j=0; j<selected.length; j++){
dis = Math.min(dis,(Math.abs(h.x - selected[j].x) + Math.abs(h.y - selected[j].y)));
}
sum += dis;
}
return sum;
}
}