2026.10.06
0.0/100.0
런타임 에러
런타임 에러 원인 분석
cur[i] = Math.max(cur[i], land[i][j] + prev[k]);
해당 줄이 런타임 에러의 원인이었다.
cur 의 크기는 4이지만, i 의 크기는 4 이상으로 커질 수 있다.
따라서 i >= 4 가 되는 순간 배열의 범위를 벗어나 런타임 에러가 발생하게 된다.
class Solution {
int solution(int[][] land) {
int[] cur = new int[land[0].length];
for (int i = 0; i < land[0].length; i++) {
cur[i] = land[0][i];
}
int[] prev = cur.clone();
for (int i = 1; i < land.length; i++) {
for (int j = 0; j < land[i].length; j++) {
for (int k = 0; k < land[i].length; k++) {
if (j == k) continue;
cur[i] = Math.max(cur[i], land[i][j] + prev[k]);
}
}
prev = cur.clone();
}
int max = 0;
for (int i = 0; i < cur.length; i++) {
max = Math.max(max, cur[i]);
}
return max;
}
}
소요 시간: 32분
시간 복잡도:
class Solution {
int solution(int[][] land) {
int[] cur = new int[land[0].length];
for (int i = 0; i < land[0].length; i++) {
cur[i] = land[0][i];
}
int[] prev = cur.clone();
for (int i = 1; i < land.length; i++) {
for (int j = 0; j < land[i].length; j++) {
for (int k = 0; k < land[i].length; k++) {
if (j == k) continue;
cur[j] = Math.max(cur[j], land[i][j] + prev[k]);
}
}
prev = cur.clone();
}
int max = 0;
for (int i = 0; i < cur.length; i++) {
max = Math.max(max, cur[i]);
}
return max;
}
}
시간 복잡도:
코드 분석
나의 코드와 동일한 구조를 가지고 있음
import java.util.Arrays;
class Solution {
int solution(int[][] land) {
int cols = land[0].length;
int[] prev = land[0].clone();
for (int i = 1; i < land.length; i++) {
int[] cur = new int[cols]; // 행마다 새 배열 → 이전 행 값이 섞이지 않음
for (int j = 0; j < cols; j++) {
int best = 0;
for (int k = 0; k < cols; k++) {
if (j != k) best = Math.max(best, prev[k]);
}
cur[j] = land[i][j] + best;
}
prev = cur; // cur는 다음 반복에서 새로 할당되므로 참조 공유 문제 없음
}
return Arrays.stream(prev).max().getAsInt();
}
}
예상치 못한 런타임 에러가 났지만,
오류가 예상되는 부분을 주석 처리를 해가며 어떤 부분이 원인인지를 알아냈고,
해당 코드의 어디가 잘못되었는지 찾는 과정을 통해서 해결할 수 있었다.