<2.9> 격자판 최대합

mutexlocking·2022년 7월 20일
0

문제
: N by N의 격자판 (2차원 배열)이 입력으로 주어지면 , 이 격자판의 각 행의 합 , 각 열의 합 , 그리고 각각의 대각선의 합(왼쪽 대각선 , 오른쪽 대각선) 의 합 중에서 , 가장 큰 합을 출력하라.
(2<=N<=50 , 격자판을 구성하는 각 자연수는 100을 넘지 않는다.)

이 문제의 요구사항은 주어진 대로 , 각 행 - 각 열 - 두 대각선의 합 중에서 가장 큰 합을 구하는 것이다.

처음에는 문제를 읽고 별도의 알고리즘이나 자료구조를 사용해야 하나 싶었지만,
일단 요구사항이 명확하고 단순한 만큼 그냥 일일이 각 행 - 열 - 양쪽 대각선의 합을 계산하여 , 이들 중에서 최댓값을 출력하는 식으로 구현하였다.
그 결과 문제의 시간제한 안에 모든 예제를 다 통과하였다.

문제의 요구사항과 , 그에 따른 해결로직이 단순한 만큼 별도의 설명 없이
구현한 코드를 첨부하고 이번 글을 마치겠다.

import java.util.Arrays;
import java.util.Scanner;

public class Main {

    public static int solution(int[][] arr, int N){
        int[] sumArr = new int[N+N+2];
        int idx = 0;

        //각 행별 합
        for(int row=0; row<N; row++){
            sumArr[idx++] = sumRow(arr, N, row);
        }

        //각 열별 합
        for(int col=0; col<N; col++){
            sumArr[idx++] = sumColumn(arr, N, col);
        }

        //양쪽 대각선의 합까지 다 sumArr에 넣은 후
        sumArr[idx++] = sumDiagonal(arr, N, 0);
        sumArr[idx]   = sumDiagonal(arr, N, N-1);


        //sumArr에 들어있는 부분 합 중에서 , 가장 큰 수를 반환

        return Arrays.stream(sumArr)
                .max()
                .getAsInt();



    }

    public static int sumRow(int[][] arr, int N, int row){
        int sum = 0;

        for(int i=0; i<N; i++){
            sum += arr[row][i];
        }

        return sum;
    }

    public static int sumColumn(int[][] arr, int N, int col){
        int sum = 0;

        for(int i=0; i<N; i++){
            sum += arr[i][col];
        }

        return sum;
    }

    public static int sumDiagonal(int[][] arr, int N, int leftOrRight){
        int sum = 0;

        //왼쪽 대각선 합
        if(leftOrRight == 0){
            for(int i=0; i<N; i++){
                sum += arr[i][i];
            }
        }
        //오른쪽 대각선 합
        else{
            for(int i=leftOrRight, j=0; i>=0; i--, j++){
                sum += arr[j][i];
            }
        }

        return sum;
    }

    public static void main(String[] args) {

        //0. Scanner 준비
        Scanner sc = new Scanner(System.in);

        //1. 입력
        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();
            }
        }

        //2. 입력받은 값을 인자로 넘기면서 solution()을 호출하여 -> 결과를 반환
        int max = solution(arr, N);

        //3. 결과 출력
        System.out.println(max);
    }

}
profile
개발자가 되고자 try 하는중

0개의 댓글