inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

15. 피자배달거리(DFS)

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

182

Mt.K

작성한 질문수 1

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);
                }
            }
        }

}

java 코딩-테스트

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 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);로 수정하면 문제를 해결할 수 있을 것으로 예상됩니다.

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

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

0

Mt.K

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

이해 했습니다!

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

안녕하세요. 바뀐 채점사이트 관련해서 문의드립니다.

0

33

1

갑자기 채점 사이트가 바뀌었어요

0

34

1

문제 리스트 페이지

0

29

1

채점 사이트 관련 질문드립니다

0

24

1

봉우리 문제 질문입니다

0

84

2

씨름 선수 문제에서 각 선수의 몸무게나 키가 같을 수도 있다면?

0

65

0

이 코드랑 영상 코드중에 뭐가 더 좋은 코드인가요?

0

72

0

가중치 방향 그래프에서 가중치가 0인 간선을 표현하는 방법

0

67

1

좌표 정렬 문제 이 코드가 왜 틀린지 모르겠습니다 ㅠㅠ

0

85

2

6-7 강의에서

0

48

1

6-6. 장난꾸러기 질문 있습니다.

0

46

1

강의 수강후 코딩테스트

0

111

1

answer 변수 사용 여부

0

46

1

2중 for문

1

85

2

2-11. 임시반장정하기 (Runtime Error)

0

63

1

혹시 LinkedList 같은 자료 구조들은 따로 배우지 않나요?

0

70

1

이런 풀이는 어떨까요

0

44

1

자바 스트림 방식의 효율성 질문 드립니다.

0

57

1

알고리즘 자료 구조들..

0

63

1

StringBuilder vs BufferdWriter

0

48

1

원더랜드(프림)

0

50

1

이런 코드는 어떤가요?

0

61

1

bfs 풀이

0

57

1

병합정렬

0

57

1