코딩테스트 및 알고리즘

격자판 최대합

영카이브 2023. 12. 17. 15:04

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

 

입력예시 :

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;

public class Main {
	public int solution(int n, int[][] arr){
		int answer = 0;
		int temp=0; 
		int sum1, sum2; 
		for( int y=0; y<n; y++ ) {
			sum1=0; sum2=0; 
			for( int x=0; x<n; x++) {
				sum1+=arr[y][x]; 
				sum2+=arr[x][y]; 
			}
			temp=Math.max(sum1,sum2); 
			if(temp>answer)answer=temp; 
		}
		sum1=0; sum2=0; 
		temp=0; 
		for( int i=0; i<n; i++ ) {
			sum1+=arr[i][i]; 
			sum2+=arr[n-1-i][i]; 
		}
		temp=Math.max(sum1, sum2); 
		if(temp>answer)answer=temp; 
		return answer;
	}

	public static void main(String[] args) {
		Main T = new Main();
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int[][] arr = new int[n][n];
		for( int y=0; y<n; y++ ) {
			for( int x=0; x<n; x++ ) {
				arr[y][x]=sc.nextInt();
			}
		}
		System.out.println(T.solution(n, arr));
	}
}

 

 

답은 바르게 나오나 코드가 비효율적이다.

가독성이 좀더 좋게 바꾸고 불필요하게 코드를 반복하지 않도록 줄였다. 

 

정정답변

public class Main {
    public int solution(int n, int[][] arr) {
        int answer = 0;
        
        // 각 행과 열의 합을 저장할 배열
        int[] rowSum = new int[n];
        int[] colSum = new int[n];
        
        int diagonalSum1 = 0;
        int diagonalSum2 = 0;

        // 행, 열, 대각선의 합을 계산
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                rowSum[i] += arr[i][j];
                colSum[j] += arr[i][j];

                if (i == j) {
                    diagonalSum1 += arr[i][j];
                }

                if (i + j == n - 1) {
                    diagonalSum2 += arr[i][j];
                }
            }
        }

        // 최대값 찾기
        for (int i = 0; i < n; i++) {
            answer = Math.max(answer, rowSum[i]);
            answer = Math.max(answer, colSum[i]);
        }

        answer = Math.max(answer, diagonalSum1);
        answer = Math.max(answer, diagonalSum2);

        return answer;
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[][] arr = new int[n][n];
        for (int y = 0; y < n; y++) {
            for (int x = 0; x < n; x++) {
                arr[y][x] = sc.nextInt();
            }
        }
        System.out.println(T.solution(n, arr));
    }
}