정사각형 그리기 질문드립니다.
142
13 asked
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 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;
}
}
}
}
}
Answer 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을 하는 로직을 추가하여, 실제 정사각형의 최대 크기를 정확히 계산할 수 있도록 했습니다.
바둑돌에 조합을 구하는 dfs는 설명이 어딨나요
0
96
1
알고리즘이라.. 강의 설명때 모식도가 있으면 더좋겠어요
0
160
1
BFS 코드 중에 이해가 안되는 부분이 있습니다.
0
219
1
호텔 연결 질문드립니다.
0
157
1
최대 선호 음식 질문드립니다.
0
217
1
숨겨진 합 질문드립니다.
0
150
1
제품이동 질문드립니다.
0
126
1
송아지 찾기2 질문드립니다.
0
125
1
호텔연결
0
143
1
중복된 문자 제거 코드
0
215
1
전투게임
0
168
1
숲속의 기사
0
131
1
멀티태스킹 질문드립니다.
0
194
1
숨겨진 합 자바 질문드립니다.
0
135
1
영화관람 시간초과 질문드립니다.
0
192
1
[2-5] 최대선호음식 시간초과..
0
263
1
dp 풀이는 어려운가요?
0
399
2
문제 의문
0
296
2
모의고사 7회 2번 송아지 찾기 테스트케이스 3번, 4번 오류
0
313
1
안녕하세요. 궁금한점이 있어서 질문드립니다.
0
244
1
BFS 참고하세요
0
265
1
#include<bits/stdc++.h>
0
761
1
잔디 문제 해설 c로 바꿔서 출력할 때
1
374
1
조합을 구할때 algorithm 함수 next_permutation 사용 가능 여부
0
459
1

