문제
: N by N의 격자판 (2차원 배열)이 입력으로 주어지면 , 이 격자판의 각 행의 합 , 각 열의 합 , 그리고 각각의 대각선의 합(왼쪽 대각선 , 오른쪽 대각선) 의 합 중에서 , 가장 큰 합을 출력하라.
(2<=N<=50 , 격자판을 구성하는 각 자연수는 100을 넘지 않는다.)
이 문제의 요구사항은 주어진 대로 , 각 행 - 각 열 - 두 대각선의 합 중에서 가장 큰 합을 구하는 것이다.
처음에는 문제를 읽고 별도의 알고리즘이나 자료구조를 사용해야 하나 싶었지만,
일단 요구사항이 명확하고 단순한 만큼 그냥 일일이 각 행 - 열 - 양쪽 대각선의 합을 계산하여 , 이들 중에서 최댓값을 출력하는 식으로 구현하였다.
그 결과 문제의 시간제한 안에 모든 예제를 다 통과하였다.
문제의 요구사항과 , 그에 따른 해결로직이 단순한 만큼 별도의 설명 없이
구현한 코드를 첨부하고 이번 글을 마치겠다.
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static int solution(int[][] arr, int N){
int[] sumArr = new int[N+N+2];
int idx = 0;
//각 행별 합
for(int row=0; row<N; row++){
sumArr[idx++] = sumRow(arr, N, row);
}
//각 열별 합
for(int col=0; col<N; col++){
sumArr[idx++] = sumColumn(arr, N, col);
}
//양쪽 대각선의 합까지 다 sumArr에 넣은 후
sumArr[idx++] = sumDiagonal(arr, N, 0);
sumArr[idx] = sumDiagonal(arr, N, N-1);
//sumArr에 들어있는 부분 합 중에서 , 가장 큰 수를 반환
return Arrays.stream(sumArr)
.max()
.getAsInt();
}
public static int sumRow(int[][] arr, int N, int row){
int sum = 0;
for(int i=0; i<N; i++){
sum += arr[row][i];
}
return sum;
}
public static int sumColumn(int[][] arr, int N, int col){
int sum = 0;
for(int i=0; i<N; i++){
sum += arr[i][col];
}
return sum;
}
public static int sumDiagonal(int[][] arr, int N, int leftOrRight){
int sum = 0;
//왼쪽 대각선 합
if(leftOrRight == 0){
for(int i=0; i<N; i++){
sum += arr[i][i];
}
}
//오른쪽 대각선 합
else{
for(int i=leftOrRight, j=0; i>=0; i--, j++){
sum += arr[j][i];
}
}
return sum;
}
public static void main(String[] args) {
//0. Scanner 준비
Scanner sc = new Scanner(System.in);
//1. 입력
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();
}
}
//2. 입력받은 값을 인자로 넘기면서 solution()을 호출하여 -> 결과를 반환
int max = solution(arr, N);
//3. 결과 출력
System.out.println(max);
}
}