/*
격자판 최대합
1. int n을 sc.nextInt()
2. 2차원 배열 생성 (0,1) (0,2) (0,3) ....(0,n) ... (n,n)
3. 값을 입력 받고
4. 최댓값을 설정. 가로 세로 대각선 경우의 수 패턴을 더해가면서 최댓값을 바꾼다.
*/
public class C21 {
public int solution(int [][]arr) {
int max = 0;
int row = 0;
int col = 0;
int dia = 0;
for(int i=0;i<arr.length;i++) {
row = 0;
col = 0;
for(int j=0;j<arr.length;j++) {
row += arr[i][j];
col += arr[j][i];
if(i==j) {
dia += arr[i][j];
}
}
if(max<row || max<dia || max <col) max = Math.max(Math.max(row, col), dia);
}
dia = 0;
int r = 0;
int len = arr.length-1;
while(len>=0) {
dia += arr[r][len];
r++; len--;
}
max = Math.max(dia, max);
return max;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
C21 c = new C21();
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.println(c.solution(arr));
sc.close();
}
}
처음 풀이
1. 정수 n을 입력받고 크기가 n인 2차원 배열을 생성한다.
2. 값을 입력받고 solution 함수에 넘긴다.
3. 가로(row), 세로(col), 대각선(dia) 변수에 최대값을 더한다.
4. 오른쪽에서 내려오는 대각선 처리를 for문에서 해주는 방법을 생각하지 못해서
5. while문을 통해 한번더 반복문을 돌렸다.
6. Math.max를 이용하여 최댓값을 찾았다.
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;
}
두번째 풀이
1. 두가지 변수를 초기화 하여 가로, 세로, 왼쪽 대각선, 오른쪽 대각선의 총 합을 구한다.
2. 비슷한 방법이였지만 변수를 그냥 초기화 시켜서 사용했기 때문에 그런 측면에서는 더 효율적이였던 코드.