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

xogh7532님의 프로필 이미지
xogh7532

작성한 질문수

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

3. 정사각형 그리기 코드해설(다이나믹 : DP)

정사각형 그리기 질문드립니다.

작성

·

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++) 반복문은 jm에 이르렀을 때 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이 되어 배열의 범위를 벗어나게 됩니다. 이를 방지하기 위해 ij가 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을 하는 로직을 추가하여, 실제 정사각형의 최대 크기를 정확히 계산할 수 있도록 했습니다.

xogh7532님의 프로필 이미지
xogh7532

작성한 질문수

질문하기