개발 공부~

[배열] 격자판 최대합 .java 본문

코딩테스트/기타

[배열] 격자판 최대합 .java

머밍 2024. 10. 21. 10:00

설명

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

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

입력

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

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

출력

최대합을 출력합니다.

예시 입력 1 

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

예시 출력 1

155

 

 

내 풀이 

1. 행의 합

: 각 행의 총 합은 바깥 for문 i를 고정해두고 arr[i][j]의 합을 구한 뒤 max 값과 비교 -> 하나의 행이 끝나면 sum 값 초기화

 

2. 대각선 

: 오른쪽 아래로 가는 대각선 -> 0,1,2,3,4의 인덱스를 가지며 arr[i][i]로 행과 열의 값이 같은 인덱스만 더한다

: 오른쪽 위로가는 대각선 ->  (0,4),(1,3),(2,2),(3,1),(4,0) -> i와 j의 합이 n-1임을 이용

 

3. 열의 합

: 열을 고정하고 행을 0~4까지 하면 된다 즉, arr[j][i]의 합

 


import java.util.Scanner;

public 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();
           }
        }
        int max = 0;
		
        //행의 합
        for (int i = 0; i < n; i++) {
            int sum = 0;
            for (int j = 0; j < n; j++) {
                sum += arr[i][j];
                if ( sum > max) {
                    max = sum;
                }
            }
        }
        //대각선1
        int sum1 = 0;
        for(int i = 0; i < n; i++) {
            sum1 += arr[i][i];
        }
        max = Math.max(max, sum1);

        //대각선 2
        int sum2 = 0;
        for(int i = 0; i < n ; i++) {
            sum2 += arr[i][n-i-1];
        }
        max = Math.max(max, sum2);
        
        //열의 합
        for (int i = 0; i < n; i++) {
            int sum3 = 0;
            for (int j = 0; j < n; j++) {
                sum3 += arr[j][i];
                if ( sum3 > max) {
                    max = sum3;
                }
            }
        }

        System.out.println(max);


    }
}

 

 

다른 풀이

내가 푼 방식의 간결한 버전이다

행과 열의 합을 함께 이중 for문으로, 두 대각선의 합을 함께 이중 for문으로 구한다

이후, 각 구한 총합과 현재 answer 변수 중 큰 값으로 갱신


import java.util.Scanner;

public class Main {
    public int solution(int n, int[][] arr){
        int answer = Integer.MIN_VALUE;
        int sum1;//행의 합
        int sum2 ;//열의 합

        for(int i=0;i<n;i++){
            sum1 = sum2 = 0;//하나의 행/열의 합 초기화
            for(int j=0;j<n;j++){
                sum1 += arr[i][j];//행 고정 -> 열만 변화 (j)
                sum2 += arr[j][i];//열 고정 -> 행만 변화 (j)
            }
            //최댓값 갱신
            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;
    }

    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 i = 0; i < n; i++) {
            for(int j = 0; j < n; j++) {
                arr[i][j] = sc.nextInt();
            }
        }

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

    }
}

 

 

💡💡

간결한 코드가 최고다

'코딩테스트 > 기타' 카테고리의 다른 글

[배열] 임시반장 정하기 .java  (0) 2024.10.22
[배열] 봉우리 .java  (0) 2024.10.21
[배열] 등수구하기 .java  (0) 2024.10.20
[배열] 점수계산 .java  (1) 2024.10.16
[배열] 뒤집은 소수 .java  (0) 2024.10.16