본문 바로가기
Computer Science/Algorithm

[Inflearn] 격자판 최대합

by 코딩맛 2022. 12. 18.

인프런의 자바(Java)알고리즘 문제풀이 입문:코딩테스트 대비 강좌의 문제를 풀고 문제 해설을 작성해보았습니다.

 

섹션2. Array(1,2차원 배열)의 9. 격자판 최대합 강의편 입니다.

 

설명

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

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

 

입력

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

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

 

출력

최대합을 출력합니다.

 

import java.util.Scanner;

public class 격차판_최대합 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int num = sc.nextInt();
		int [][] arrNum = new int[num][num];
		for(int i = 0; i<num; i++) {
			for(int j = 0; j<num; j++) {
				arrNum[i][j] = sc.nextInt();
			}
		}
		
		System.out.println(solution(num, arrNum));

	}
	
	public static int solution(int num, int[][] arrNum) {
		int[] rowSum = new int[num];
		int[] columnSum = new int[num];
		int toRightCrossSum = 0;
		int toLeftCrossSum = 0;
		int maxSum = 0;
		for(int i=0; i<num; i++) {
			for(int j = 0; j<num; j++) {
				rowSum[i] += arrNum[i][j];
				columnSum[i] += arrNum[j][i];
				if(i==j) {
					toRightCrossSum += arrNum[i][j];
				}
				if(j+i == num-1) {
					toLeftCrossSum += arrNum[i][j];
				}
			}
			if(rowSum[i]>maxSum) {
				maxSum = rowSum[i];
			}else if(columnSum[i]>maxSum) {
				maxSum = columnSum[i];
			}
		}
		if(toRightCrossSum > maxSum) {
			maxSum = toRightCrossSum;
		}else if(toLeftCrossSum > maxSum) {
			maxSum = toLeftCrossSum;
		}
		return maxSum;
	}

}

>>해설

각 행의 합, 각 열의 합을 저장할 배열 rowSum, columnSum 변수를 선언한다.

좌측 위에서 우측 아래로 향하는 대각선의 합을 저장할 toRightCrossSum 변수를 선언한다.

우측 위에서 좌측 아래로 향하는 대각선의 합을 저장할 toLeftCrossSum 변수를 선언한다.

 

변수 i값으로 바깥에서 반복문을 돌고,  변수 j값으로 안에서 이중 반복문을 돌렸을 때 

1. 행의 합을 rowSum에 저장 ->  배열이 1차원 값은 고정, 2차원 값은 증가

   arrNum[i][j] 형태

 

2. 열의 합을 columnSum에 저장 ->  배열은 1차원 값은 증가, 2차원 값은 고정

   arrNum[j][i] 형태

 

3. toRightCrossSum에 대각선 값을 저장 -> 배열의 1차원 값 == 배열의 2차원 값

  i값과 j값이 동일할 때 현재 배열의 값을 저장

 

4. toLeftCrossSum에 대각선 값을 저장 -> 배열의 2차원 값 + 1차원 값 == 입력받은 숫자 -1  

j + i값이 자연수-1 과 같으면 현재 배열의 값을 저장

 

rowSum[],  columnSum[] 배열 변수 같은 경우는 각 행, 각 열의 합을 담고 있기 때문에 , j변수 반복문을 빠져나오고 i변수 반복문을 돌 때 최대값을 비교하고

toRightCrossSum, toLeftCrossSum 변수는 대각선의 합이 정수형 변수에 각각 들어가기 때문에 이중 반복문을 빠져 나온 뒤 최대값을 비교한다.

'Computer Science > Algorithm' 카테고리의 다른 글

[Inflearn] 임시반장 정하기  (0) 2023.01.03
[Inflearn] 봉우리  (0) 2023.01.01
[Inflearn] 등수구하기  (0) 2022.12.11
[Inflearn] 점수계산  (0) 2022.12.03
[Inflearn] 뒤집은 소수  (0) 2022.11.26