inflearn logo
강의

Course

Instructor

Coding Test Practice Test (with C++): For Large Companies

3. Square drawing code explanation (Dynamic: DP)

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

142

xogh7532

13 asked

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;
        		}
        	}
        }
	}
}

c++ 코딩-테스트

Answer 1

0

communityai8509

안녕하세요, 인프런 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을 하는 로직을 추가하여, 실제 정사각형의 최대 크기를 정확히 계산할 수 있도록 했습니다.

바둑돌에 조합을 구하는 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