• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    미해결

숲속의 기사

24.04.16 10:45 작성 조회수 36

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

 

예제는 통과해서 제출하니까 시간초과라고 뜨는데, 잘못 작성한건 가요??

import java.io.*;
import java.util.*;

public class Main {
	public static void main(String[] argvs) {
		Scanner sc = new Scanner(System.in);
		
		int[] dx = {0,0,1,-1};
		int[] dy = {1,-1,0,0};
		
		Queue<int[]> q = new LinkedList<>();
		int n=sc.nextInt();
		int m=sc.nextInt();
		int[][] map = new int[m][n];
		for(int i=0; i<m; i++) {
			for(int j=0; j<n; j++) {
				map[i][j]=sc.nextInt();
			}
		}
		boolean[][] visit = new boolean[m][n];
		int[][] dist = new int[m][n];
		for(int i=0; i<m; i++) {
			for(int j=0; j<n; j++) {
				if(map[i][j]==2 || map[i][j]==3) {
					q.add(new int[] {i,j});
					int L=0;
					visit = new boolean[m][n];
					visit[i][j]=true;
					
					while(!q.isEmpty()) {
						int len = q.size();
						L++;
						for(int k=0; k<len; k++) {
							int[] tmp = q.poll();
							for(int z =0; z<4; z++) {
								int nx = tmp[0]+dx[z];
								int ny = tmp[1]+dy[z];
								if(nx>=0 && ny>=0&& nx<m && ny<n && map[nx][ny]!=1) {
									if(!visit[nx][ny]) {
										visit[nx][ny]=true;
										dist[nx][ny]+=L;
										q.add(new int[] {nx,ny});
									}
								}
							}
						}
					}
				}
			}
		}
		int answer=Integer.MAX_VALUE;
		for(int i=0; i<m; i++) {
			for(int j=0; j<n; j++) {
				if(map[i][j]==4 && dist[i][j]>0) {
					answer = Math.min(answer, dist[i][j]);
				}
			}
		}
		System.out.print(answer);
	}
}

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.04.18

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

xogh7532님, 코드를 보니 BFS를 사용하여 문제를 해결하려는 시도로 보입니다. 시간 초과 문제는 대체적으로 비효율적인 알고리즘 구조나 불필요한 반복 때문에 발생할 수 있습니다. 해당 코드에서 매 상태에서 방문 여부를 확인하는 visit 배열을 사용하는 것은 좋으나, 각 위치(i,j)에서 BFS를 시작할 때마다 visit 배열을 새로 생성하고 초기화하는 작업을 반복하고 있습니다. 이는 비효율적인 메모리 사용과 시간 소모를 가져올 수 있습니다.

또한, 모든 위치에서 BFS를 시작하는 대신, 문제의 요구사항에 따라 특정 조건(예: 특정 값이 있는 위치)에서만 BFS를 시작하는 등의 최적화를 고려해볼 필요가 있습니다. 문제의 조건이나 목적을 더 자세히 고려하여, 불필요한 탐색을 줄이거나, 탐색 과정에서의 조건을 더 효율적으로 처리할 방법을 찾아보는 것이 좋겠습니다.

시간 초과 문제 해결을 위한 구체적인 제안:
- visit 배열의 초기화를 BFS 시작 전 한 번만 수행합니다.
- 모든 점에서 BFS를 시작하는 대신, 문제의 조건에 맞는 시작점을 선정하여 탐색의 범위를 줄여볼 수 있습니다.
- 큐에 삽입하는 조건이나 방문 체크를 더 효율적으로 관리하여 불필요한 반복을 최소화합니다.

다시 한 번 코드를 점검해보시고, 알고리즘의 효율성을 개선해볼 방법을 고민해보시길 바랍니다. 추가적인 질문이 있으시면 도움을 드리기 위해 여기 있겠습니다.