작성
·
66
0
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
dp를 작성하는 else 부분에서 배열의 범위가 벗어났다고 뜨는데, 어디가 잘 못 된건가요???
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] argvs) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();
int[][] map = new int[n][m];
int[][] dp = new int[n][m];
for(int i=0; i<n; i++) {
String s=sc.next();
for(int j=1; j<=m;j++) {
map[i][j]=s.charAt(j)-'0';
}
}
for(int i=0; i<n ; i++) {
for(int j=0; j<m; j++) {
if(map[i][j]==0) dp[i][j]=0;
else { //에러 부분(배열 범위 벗어남)
int a=map[i-1][j];
int b=map[i][j-1];
int c=map[i-1][j-1];
int k = Math.min(a, Math.min(b, c));
dp[i][j] = k;
}
}
}
}
}
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
xogh7532님, 자바 코드에서 정사각형을 그리는데 있어 배열의 범위를 벗어나는 오류를 겪고 계신 것 같네요.
문제의 핵심은 배열 map
에 접근할 때 map[i][j]=s.charAt(j)-'0';
부분에서 배열의 인덱스 범위를 벗어나고 있습니다. 자바에서 배열은 0부터 시작하기 때문에, for(int j=1; j<=m;j++)
반복문은 j
가 m
에 이르렀을 때 map[i][j]=s.charAt(j)-'0';
에서 IndexOutOfBoundsException
을 일으킵니다. 정확히는 s.charAt(j)
부분에서 문제가 발생합니다. 이 부분을 for(int j=0; j<m;j++)
로 수정하고, map[i][j]=s.charAt(j)-'0';
에서 charAt
의 인덱스를 j
로 변경하여야 합니다.
또 다른 오류는, else
문 내에서 i-1
또는 j-1
이 0보다 작을 때에 대한 예외 처리가 없어서 생기는 문제입니다. 배열의 첫 번째 행 또는 첫 번째 열에 있는 경우, 즉 i-1
또는 j-1
이 -1이 되어 배열의 범위를 벗어나게 됩니다. 이를 방지하기 위해 i
와 j
가 0보다 클 때만 해당 로직을 실행하도록 조건을 추가해야 합니다.
수정된 코드는 다음과 같습니다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] argvs) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();
int[][] map = new int[n][m];
int[][] dp = new int[n][m];
for(int i=0; i<n; i++) {
String s=sc.next();
for(int j=0; j<m;j++) { // 변경된 부분
map[i][j]=s.charAt(j)-'0';
}
}
for(int i=0; i<n ; i++) {
for(int j=0; j<m; j++) {
if(map[i][j]==0) dp[i][j]=0;
else { // 배열 범위를 벗어나지 않도록 조건 추가
if(i > 0 && j > 0) { // 변경된 부분
int a=map[i-1][j];
int b=map[i][j-1];
int c=map[i-1][j-1];
int k = Math.min(a, Math.min(b, c)) + 1; // 정사각형 크기를 업데이트 할 때 +1을 해줘야 정확함
dp[i][j] = k;
} else {
dp[i][j] = 1; // 최소값으로 1 설정
}
}
}
}
}
}
이제 dp
배열의 범위를 벗어나는 문제를 해결했습니다. 또한, 정사각형의 크기를 구하기 위해 +1
을 하는 로직을 추가하여, 실제 정사각형의 최대 크기를 정확히 계산할 수 있도록 했습니다.