작성
·
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를 시작하는 대신, 문제의 조건에 맞는 시작점을 선정하여 탐색의 범위를 줄여볼 수 있습니다.
- 큐에 삽입하는 조건이나 방문 체크를 더 효율적으로 관리하여 불필요한 반복을 최소화합니다.
다시 한 번 코드를 점검해보시고, 알고리즘의 효율성을 개선해볼 방법을 고민해보시길 바랍니다. 추가적인 질문이 있으시면 도움을 드리기 위해 여기 있겠습니다.