인프런 커뮤니티 질문&답변

Mt.K님의 프로필 이미지
Mt.K

작성한 질문수

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

15. 피자배달거리(DFS)

섹션 8.15 피자배달거리 시간초과

작성

·

113

0

안녕하세요, 피자 배달거리 질문드립니다.

처음에는 제가 강의에서 풀어주신 코드와 유사한 방식으로 작성했었는데 정답은 맞게 나오지만 제출해보면 자꾸 시간 초과가 떠서..

강의를 보면서 완전히 같은 코드로 고쳐봤는데도 시간 초과가 뜨네요ㅠㅠ

혹시 이 코드에 문제점이 뭔지 답변 주시면 감사하겠습니다!

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

class Points {
    int x,y;
    Points(int x, int y) {
        this.x= x;
        this.y = y;
    }
}

public class Main {

    static int n, m, len = 0;
    static int answer = Integer.MAX_VALUE;
    static int[] ch;
    static List<Points> pizzaDis, homes;

    // 피자 배달거리
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        m = in.nextInt();

        pizzaDis = new ArrayList<>();
        homes = new ArrayList<>();

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                int num = in.nextInt();
                if (num == 2) {
                    pizzaDis.add(new Points(j, i));
                } else if (num == 1) {
                    homes.add(new Points(j,i));
                }
            }
        } 
        len = pizzaDis.size();
        ch = new int[m];
        dfs(0,0);

        System.out.println(answer);
    }

    static void dfs(int level, int start) {
        if (level == m) {
            int sum = 0;
            for (Points h : homes) {
                int min = Integer.MAX_VALUE;
                for (int p : ch) {
                    min = Math.min(min, Math.abs(h.x - pizzaDis.get(p).x) + Math.abs(h.y - pizzaDis.get(p).y));
                }
                sum += min;
            }
            answer = Math.min(sum, answer);
        } else {
            for (int i = start; i < len; i++) {
                    ch[level] = i;
                    dfs(level + 1 ,start + 1);
                }
            }
        }

}

답변 1

0

안녕하세요, 인프런 AI 인턴입니다, Mt.K님.

문제 “피자 배달 거리”에 대한 시간 초과 이슈를 해결하는 데 있어, 여러 비슷한 질문들에서 공통적으로 지적된 부분이 있습니다. 이 문제는 주로 DFS(깊이 우선 탐색) 함수 내에서 재귀 호출을 하는 방식에서 발생하는 것으로 보입니다.

질문자님의 코드에서 dfs(level + 1, start + 1); 호출 부분에 주목해야 합니다. 기존 답변에서 지적된 바에 따르면, 이 부분에서 start+1 대신에 i+1을 사용해야 올바른 조합을 생성하며, 이를 통해 탐색 범위를 제대로 제한하여 시간 초과 문제를 방지할 수 있습니다.

비슷한 문제에 대한 과거 질문에 대한 답변 중에서 핵심적인 지적이 있었습니다:
- “피자배달거리”에서는 DFS(L + 1, s + 1);DFS(L + 1, i + 1);로 수정되어야 한다고 설명되었습니다.
- 또 다른 관련 질문 “피자배달거리(DFS) 시간초과 질문 있습니다.”에서도 유사한 문제가 지적되었으며, 정확한 재귀 호출 방법이 강조되었습니다.
- “시간 초과” 문제 해결을 위해서도, DFS(index+1, start+1);가 아닌 DFS(index+1, i+1);으로 수정되어야 한다는 답변이 제공되었습니다.

이러한 지적들을 종합해볼 때, 질문자님의 코드에서도 dfs(level + 1, start + 1); 부분을 dfs(level + 1, i + 1);로 수정하면 문제를 해결할 수 있을 것으로 예상됩니다.

자세한 참고를 위해 위 질문에서 언급된 피자배달거리 문제에 대한 기존 답변을 참고해 보시기 바랍니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

Mt.K님의 프로필 이미지
Mt.K
질문자

아..! 저 부분때문에 그랬군요.

이해 했습니다!

빠른 답변 감사드립니다!!

Mt.K님의 프로필 이미지
Mt.K

작성한 질문수

질문하기