• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    미해결

트리 레벨 체크로는 안되는건가요??

24.04.18 22:46 작성 조회수 38

0

예전 BFS 영상에서 최단 경로 길이를 구하기 위해서는 트리 레벨 체크를 활용하는 것을 보고 이번에도 큐 사이즈 만큼 반복을 돌아서 트리 레벨을 체크 하는 방식으로 구현하였는데

프로그램에선 12로 잘 나오지만,

채점에선 오류가 떠서 이 방식으론 안되는지 궁금합니다..

 

또, 강의를 들으면서 배열에 +1씩 추가하는 아이디어를 보고 기존의 배열에서 +1씩 해주어 수정한 결과는 통과하였는데, DIS배열을 하나 더 만든 이유도 궁금합니다!

 

추가로 젤 윗 이야기인 큐 사이즈 만큼 반복하여 레벨을 체크하는 상황과 배열에 +1씩 하여 넓혀가는 상황의 구별을 어떻게 할 수 있을지도 궁금해졌습니다...

 

감사합니다

 

 

import java.awt.*;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class In_8_11 {
    static int[][] matrix = new int[8][8];
    static int[] dx = {-1, 0, 1, 0};
    static int[] dy = {0, 1, 0, -1};
    static int level;
    public static int BFS(int x, int y) {
        Queue<Point> Q = new LinkedList<>();

        // 가장 처음 큐에 넣기
        Q.offer(new Point(x,y));
        matrix[1][1] = 1; // 출발지점 꼭 걸어줘야함.

        // 시작
        while( !Q.isEmpty()){
            for (int j = 0; j < Q.size(); j++) {
                Point P = Q.poll();
                System.out.println("( "+P.x + " , " + P.y+" )");

                if (P.x == 7 && P.y == 7){
                    //return matrix[7][7] -1;
                    return level;
                }

                for (int i = 0; i < 4; i++) {
                    int nx = P.x + dx[i];
                    int ny = P.y + dy[i];

                    if (1 <= nx && nx <= 7 && 1 <= ny && ny <= 7) {
                        if (matrix[nx][ny] == 0) {
                            matrix[nx][ny] = 1;
                            //matrix[nx][ny] = matrix[P.x][P.y] +1; // 뺄 필요 없을 거 같은데?
                            Q.offer(new Point(nx, ny));
                        }
                    }
                }
            }level++;
        }
        return -1;
    }

    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        for(int i = 1; i <= 7; i++){
            for(int j = 1; j <= 7; j++) {
                matrix[i][j] = sc.nextInt();
            }
        }
        System.out.println( BFS(1, 1) );
    }
}

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.04.18

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

you9222님의 질문에 대해서, 큐의 사이즈만큼 반복하여 트리 레벨을 체크하는 방법과 DIS 배열에 +1씩 하여 거리를 체크하는 방법 간의 차이점, 그리고 이 두 방법의 사용 상황에 대한 답변을 찾으시는 것 같습니다.

이와 비슷한 주제를 다룬 질문을 우선 찾았습니다. 코드의 이 부분을 다르게 풀었는데, 괜찮은지 질문드립니다!에서 답변을 찾을 수 있었습니다. 강의에서 큐의 사이즈만큼 반복하는 방법이 성능상 큰 차이는 없으나, 더 복잡한 문제를 해결할 때 유익하다고 합니다. 이 방법은 레벨별로 큐에 있는 요소들을 한번에 처리하여 각 레벨을 명확히 구분할 수 있게 해줍니다.

BFS를 이용해 최단 거리를 찾을 때 DIS 배열을 사용하는 이유는 각 지점까지의 정확한 거리를 기록하며, 이를 통해 최단 거리를 판별하거나, 특정 조건을 충족하는 경로를 찾는 등 다양한 상황에 활용할 수 있기 때문입니다. 배열에 +1씩 하여 넓혀가는 상황은 각 지점을 방문하며 거리를 누적해 기록하는 방식입니다. 이 방식 또한 BFS와 함께 사용되며, 탐색 과정에서 거리에 대한 명확한 정보가 필요한 경우에 주로 사용됩니다.

두 방식의 구별은 대체로 문제의 요구사항에 따라 결정됩니다. 문제가 레벨별로 정보를 요구하면 큐의 사이즈를 활용한 레벨 체크가 유용하고, 문제가 각 지점까지의 구체적인 거리 정보를 요구하면 DIS 배열을 활용하는 것이 좋습니다.

따라서, 큐 사이즈만큼 반복하여 레벨을 체크하는 방식은 레벨(단계)이 중요한 문제에서 활용되고, 배열에 +1씩 하여 넓혀가는 방식은 각 점까지의 실제 최단 거리를 찾아야 할 때 유용합니다.

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