이 알고리즘 문제는 인프런의 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 (김태원)의 문제입니다.


문제 설명

 

코드

처음 작성한 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class sec02_09 {
    public static int solution(int N, int[][] numArr) {
        int rightUp = 0;
        for(int i = 0; i < N; ++i)
        {
            int colSum = 0;
            for(int j = 0; j < N; ++j)
            {
                colSum += numArr[j][i];
                if(i + j == N - 1) rightUp += numArr[i][j];
            }
            numArr[N][i] = colSum;
        }
        int max = 0;
        for(int i = 0; i < N; ++i) if(max < numArr[i][N]) max = numArr[i][N];
        for(int i = 0; i < N; ++i) if(max < numArr[N][i]) max = numArr[N][i];
        if(max < rightUp) max = rightUp;
        return max;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int[][] arr = new int[N + 1][N + 1];
        int rightDown = 0;
        for(int i = 0; i < N; ++i) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int rowSum = 0;
            for(int j = 0; j < N; ++j)
            {
                arr[i][j] = Integer.parseInt(st.nextToken());
                rowSum += arr[i][j];
                if(i == j) rightDown += arr[i][j];
            }
            arr[i][N] = rowSum;
        }
        arr[N][N] = rightDown;
        System.out.println(solution(N, arr));
    }
}

 

개선한 코드

package inflearn_algorithm.chapter2;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class sec02_09 {
    public static int solution(int N, int[][] numArr) {
        int max = 0;
        int rightUp = 0;
        int rightDown = 0;

        for (int i = 0; i < N; ++i)
        {
            int rowSum = 0;
            int colSum = 0;
            for (int j = 0; j < N; ++j)
            {
                rowSum += numArr[i][j];
                colSum += numArr[j][i];
                if (i == j) rightDown += numArr[i][j];
                if (i + j == N - 1) rightUp += numArr[i][j];
            }
            max = Math.max(max, rowSum);
            max = Math.max(max, colSum);
        }

        max = Math.max(max, rightDown);
        max = Math.max(max, rightUp);

        return max;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int[][] arr = new int[N][N];

        for (int i = 0; i < N; ++i)
        {
            StringTokenizer st = new StringTokenizer(br.readLine());
            for (int j = 0; j < N; ++j) arr[i][j] = Integer.parseInt(st.nextToken());
        }

        System.out.println(solution(N, arr));
    }
}

 

개선된 코드에 대한 설명

  • 초기 변수 설정
    max 변수는 최댓값을 저장하기 위해 사용된다.
    rightUp 변수는 오른쪽 위 대각선의 합을 저장한다.
    rightDown 변수는 오른쪽 아래 대각선의 합을 저장한다.

  • 이중 반복문을 통한 합 계산
    외부 반복문 for (int i = 0; i < N; ++i)는 행을 기준으로 반복한다.
    내부 반복문 for (int j = 0; j < N; ++j)는 열을 기준으로 반복한다.
    rowSum 변수는 현재 행의 합을 계산한다.
    colSum 변수는 현재 열의 합을 계산한다.
    if (i == j) 조건문을 통해 오른쪽 아래 대각선(rightDown)의 합을 계산한다.
    if (i + j == N - 1) 조건문을 통해 오른쪽 위 대각선(rightUp)의 합을 계산한다.

  • 최대값 갱신
    각 행의 합(rowSum)과 각 열의 합(colSum)을 계산한 후, 현재의 max 값과 비교하여 최대값을 갱신한다.

  • 대각선의 합과 비교
    오른쪽 아래 대각선의 합(rightDown)과 오른쪽 위 대각선의 합(rightUp)을 계산한 후, 현재의 max 값과 비교하여 최대값을 갱신한다.

  • 최종 결과 반환
    최종적으로 계산된 최대값(max)을 반환한다.