땅따먹기_복습3

하이솝·2026년 10월 6일

코테 · DP

목록 보기
10/11

2026.10.06

문제 풀이

1차 실행 오류

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분
시간 복잡도: O(N)O(N)

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

AI 코드

시간 복잡도: O(N)O(N)
코드 분석

나의 코드와 동일한 구조를 가지고 있음

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

문제 풀이 후기

예상치 못한 런타임 에러가 났지만,
오류가 예상되는 부분을 주석 처리를 해가며 어떤 부분이 원인인지를 알아냈고,
해당 코드의 어디가 잘못되었는지 찾는 과정을 통해서 해결할 수 있었다.

0개의 댓글