2-9 격자판 최대합

정우·2022년 10월 4일

✏️ 문제


설명

55 격자판에 아래롸 같이 숫자가 적혀있습니다.

N
N의 격자판이 주어지면 각 행의 합, 각 열의 합, 두 대각선의 합 중 가 장 큰 합을 출력합니다.

입력

첫 줄에 자연수 N이 주어진다.(2<=N<=50)

두 번째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어진다. 각 자연수는 100을 넘지 않는다.

출력

최대합을 출력합니다.

예제입력5
10 13 10 12 15
12 39 30 23 11
11 25 50 53 15
19 27 29 37 27
19 13 30 13 19

예제출력 155


✏️ 코드

import java.util.Scanner;

class Main {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int[][] arr = new int[N][N];
        
        for (int i=0; i<N; i++) {
            for (int j=0; j<N; j++) {
                arr[i][j] = sc.nextInt();
            }
        }
        
        System.out.println(solution(N, arr));
    }
        
    public static int solution(int N, int[][] arr) {
        int sum1, sum2;
        int answer = Integer.MIN_VALUE;
        
        for (int i=0; i<N; i++) {
            sum1=sum2=0;
            for (int j=0; j<N; j++) {
                sum1 += arr[i][j];
                sum2 += arr[j][i];
            }
            answer = Math.max(answer, sum1);
            answer = Math.max(answer, sum2);
        }
        sum1 = sum2 = 0;
        
        for (int i=0; i<N; i++) {
            sum1 += arr[i][i];
            sum2 += arr[i][N-i-1];
        }
        
        answer = Math.max(answer, sum1);
        answer = Math.max(answer, sum2);
        
        return answer;
    }
}

행과 열의 합을 담을 변수 sum1 그리고 sum2를 선언한다.
행의 경우 i는 고정 j는 움직이기 때문에 sum1에는 arr[i][j]로 누적, 열은 반대이기 때문에 arr[j][i]로 누적한다.

answer변수에는 최대값을 구할 것이기 때문에 정수의 가장 작은 수로 선언해준다.

이후 Math.max()로 행과 열 중 가장 큰 합을 구하고 저장해놓는다.

오른쪽 대각선의 경우 (1,1), (2,2) ... 으로 동시에 같이 증가하기 때문에 arr[i][i]를 통해서 저장한다.

반대쪽 대각선의 경우 (4,0), (3,1) ... 식으로 줄어들고 증가하기 때문에 arr[i][N-i-1]로 구해주며 누적한다.


정리

왼쪽 대각선은 arr[i][N-i-1], N=배열의 길이

profile
That's it

0개의 댓글