[알고리즘] 배열(9) : 격자판 최대합(JAVA)

ho's·2022년 5월 23일
0

문제

문제는 간단하다.
가로합, 세로합, 대각선의 합을 비교하여 가장 큰 합을 출력하는 것이다.

풀이

간단하게 생각해보기로 했다.

  • 2중 for문을 이용해 가로합, 세로합, 대각선의 합을 구하는 코드를 작성하고 각 합의 최댓값을 저장한다.

  • 가로합, 세로합, 대각선의 합을 배열에 넣어 최댓값을 비교한 후 출력한다.


위와 같이 생각을 하고 문제를 푸는데에 성공했지만, 소스가 불필요해 보이는게 많아 보인다.

package algolecture;

import java.io.IOException;
import java.util.Arrays;
import java.util.Scanner;

public class Main21 {
    public static void main(String[] args) throws IOException {
        Scanner scan = new Scanner(System.in);
        int size = scan.nextInt();
        int[][] arr = new int[size][size];
        int[] MAXWIDTH = new int[size];
        int[] MAXHEIGHT = new int[size];
        int[] MAXDAEGAK = new int[2];

        for(int i=0;i<size;i++) {
            for(int j=0;j<size;j++){
                arr[i][j] = scan.nextInt();
            }
        }
        
        // 가로합
        for(int i=0;i<size;i++){
            for(int j=0;j<size;j++){
                //arr[0][0] + arr[0][1] + arr[0][2] + ...
                MAXWIDTH[i] += arr[i][j];
            }
        }

        for(int j=0;j<size;j++){
            for(int i=0;i<size;i++){
                MAXHEIGHT[j] += arr[i][j];
            }
        }

        for(int i=0;i<size;i++){
            for(int j=0;j<size;j++){
                if(i == j){
                    MAXDAEGAK[0] += arr[i][j];
                }
            }
            MAXDAEGAK[1] += arr[i][size-(i+1)];
        }


        Arrays.sort(MAXWIDTH);
        Arrays.sort(MAXHEIGHT);
        Arrays.sort(MAXDAEGAK);

        int[] MAXMAX = new int[3];
        MAXMAX[0] = MAXWIDTH[MAXWIDTH.length-1];
        MAXMAX[1] = MAXHEIGHT[MAXHEIGHT.length-1];
        MAXMAX[2] = MAXDAEGAK[MAXDAEGAK.length-1];

        Arrays.sort(MAXMAX);
        System.out.print(MAXMAX[MAXMAX.length-1]);

        

    }
}

소스코드


package algolecture;

import java.util.Scanner;

public class Main21 {
    public int solution(int n, int[][] arr){
        int answer = Integer.MIN_VALUE;
        int sum1, sum2;
        //sum1 은 행
        //sum2 는 열
        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;

        // 2중 for문을 이용할 필요가 없다.
        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;
    }

    public static void main(String[] args){
        Main21 T = new Main21();
        Scanner kb = new Scanner(System.in);
        int n = kb.nextInt();
        int[][] arr = new int[n][n];

        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                arr[i][j] = kb.nextInt();
            }
        }

        System.out.print(T.solution(n,arr));

    }
}

위의 코드는 내가 위에서 작성했던 코드처럼 배열을 따로 만들지 않았다. 훨씬 간편해 보인다.

profile
그래야만 한다

0개의 댓글