격자판 최대합

Seungmin Lim·2022년 2월 7일
0

코딩문제연습

목록 보기
23/63

문제

나의풀이

import java.util.*;

class Main {
	public int solution(int n,int[][] arr) {
			int answer = Integer.MIN_VALUE;
			int 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;
			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 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.println(T.solution(n, arr));
	}
	
}

풀이방법

int answer = MIN.VALUE 로 설정한 이유는,
이 문제에서는 범위가 자연수로 정해져 있지만 만약 값 중에서 음수가 있으면 합이 0보다 적은 값이 나올수있기 때문에 integer의 가장 최솟값으로 설정했다.

이중for문으로 각 행을 sum1에 저장하고 각 열을 sum2에 저장해서
바깥쪽 for문이 한번돌때, i행의 합과 i열의 합 중에서 큰 값을 answer에 넣었다.

for문이 다끝나고나면 answer에는 모든 행과 열만을 비교했을때 가장 큰 값이 담겨있는데, 두 대각선 값을 구하기위해
for문을 한번 더 돌려서 각 대각선의 값을 구하고 대각선의 값들 중에서 더 큰 것이 존재한다면 answer에 담게했다.

핵심키워드

행열에 대해 이해하자!

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

이런 5 * 5 행열(arr[][])이 있을때, 가로줄이 행, 세로줄이 열이다.
arr에서 값을 구할때는 arr[행][열]에 원하는 값을 넣으면 구할수있다.
예)
arr[0][3] = 12
arr[2][4] = 15
따라서 이중for문으로 i값을 고정시키고 j값만 돌릴때,

for(int i=0; i<n; i++){
	for(int j=0; j<n; j++){
    	arr[i][j]; //행의값
        arr[j][i]; //열의값
    }
}

arr[i][j] 는 0~4까지의 행의값(가로줄의 값)
arr[j][i] 는 0~4까지의 열의값(세로줄의 값) 이 찍힌다.

또한, 대각선의 값을 구할때는
arr[i][i] 를 하게되면 arr[0][0] ... arr[4][4] 이렇게만 찍히기 때문에
왼쪽위에서 오른쪽 아래로 내려오는 대각선 값을 찍을수있고,

arr[i][n-i-1]을 하게되면 arr[0][4] ... arr[4][0] 이렇게만 찍히기 때문에 오른쪽위에서 왼쪽 아래로 내려오는 대각선 값을 찍을수있다.

0개의 댓글