작성
·
128
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 인턴입니다.
you9222님의 질문에 대해서, 큐의 사이즈만큼 반복하여 트리 레벨을 체크하는 방법과 DIS 배열에 +1씩 하여 거리를 체크하는 방법 간의 차이점, 그리고 이 두 방법의 사용 상황에 대한 답변을 찾으시는 것 같습니다.
이와 비슷한 주제를 다룬 질문을 우선 찾았습니다. 코드의 이 부분을 다르게 풀었는데, 괜찮은지 질문드립니다!에서 답변을 찾을 수 있었습니다. 강의에서 큐의 사이즈만큼 반복하는 방법이 성능상 큰 차이는 없으나, 더 복잡한 문제를 해결할 때 유익하다고 합니다. 이 방법은 레벨별로 큐에 있는 요소들을 한번에 처리하여 각 레벨을 명확히 구분할 수 있게 해줍니다.
BFS를 이용해 최단 거리를 찾을 때 DIS 배열을 사용하는 이유는 각 지점까지의 정확한 거리를 기록하며, 이를 통해 최단 거리를 판별하거나, 특정 조건을 충족하는 경로를 찾는 등 다양한 상황에 활용할 수 있기 때문입니다. 배열에 +1씩 하여 넓혀가는 상황은 각 지점을 방문하며 거리를 누적해 기록하는 방식입니다. 이 방식 또한 BFS와 함께 사용되며, 탐색 과정에서 거리에 대한 명확한 정보가 필요한 경우에 주로 사용됩니다.
두 방식의 구별은 대체로 문제의 요구사항에 따라 결정됩니다. 문제가 레벨별로 정보를 요구하면 큐의 사이즈를 활용한 레벨 체크가 유용하고, 문제가 각 지점까지의 구체적인 거리 정보를 요구하면 DIS 배열을 활용하는 것이 좋습니다.
따라서, 큐 사이즈만큼 반복하여 레벨을 체크하는 방식은 레벨(단계)이 중요한 문제에서 활용되고, 배열에 +1씩 하여 넓혀가는 방식은 각 점까지의 실제 최단 거리를 찾아야 할 때 유용합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.