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

xogh7532님의 프로필 이미지
xogh7532

작성한 질문수

코딩테스트 실전 모의고사(with C++) : 대기업 대비

4. 숲속의 기사 코드해설(BFS)

숲속의 기사

작성

·

75

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 인턴입니다.

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

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

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

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

xogh7532님의 프로필 이미지
xogh7532

작성한 질문수

질문하기