코드

import java.util.*;
import java.util.stream.IntStream;

class 격자판최대합 {	
	public static void main(String[] args){
		int max = Integer.MIN_VALUE;
		int n = 10;
		
		int[][] arr = IntStream.range(0, n)
				               .mapToObj(index->{
			    	               return new Random().ints(n, 1, 100)
			    			                          .toArray();
			                   }).toArray(int[][]::new);
		prettyPrint(arr);
		
		int rowSum, colSum, cSum1=0,cSum2=0;
		
		for(int i= 0; i<n; i++) {
			rowSum=0;
			colSum=0;
			//핵심 같은 반복문이라도 구조가 유사하니
			//j , i 위치만 바꾸면 한방에 해결
			//구조 i==j , i+j == length-1 , [고정][순회], [순회],[고정]
			for(int j= 0; j<n ;j++) {
				rowSum += arr[i][j]; //같은 행 합
				colSum += arr[j][i]; //같은 열 합
			}
			cSum1+=arr[i][i];     //좌상우하 대각선 for문 1개만 필요
			cSum2+=arr[i][n-1-i]; //우상좌하 대각선
			
			// 내가 틀린 부분 기존 값이 신규 값보다 더 클 수 있다는 것을 간과
//			max = rowSum<colSum ? colSum : rowSum;
			max = max < rowSum ? rowSum 
			    : max < colSum ? colSum : max ;
		}
		max = max < cSum1 ? cSum1 
			: max < cSum2 ? cSum2 : max;
		
		System.out.println(max);
		
	}
	static void prettyPrint(int[][] arr, boolean isIndex) {
		for(int i=0;i<arr.length;i++) {
			for(int j=0;j<arr[i].length;j++) {
				if(isIndex) System.out.printf("%2d,%2d ", i,j);
				else System.out.printf("%2d" + (j==arr[i].length-1? "":",") ,arr[i][j]);
			}
			System.out.println(isIndex?"\n":"");
		}
	}
	static void prettyPrint(int[][] arr) {
		prettyPrint(arr, false);
	}
}

결과

 

92,70,45,49,49,56,60,93,58,72
20,49,49,71,50,25,41,70,86,89
29,33,69,31,11,33,57, 4,90,75
74,14,22,60,33,42,14,94,37,15
70,64,12,17, 6,23,90,52,65,45
96,90, 5,53,84,50,32,61,70,68
84,74,80,79,83,92, 6,32, 2,22
95,14,81,26,84, 9,25,55,89,93
51,84,84,66,11,46,20,33,92,87
97,12,89,13, 9,10,16,11,72,32
661

정사각형 배열의 경우 i, j 길이가 같기 때문에 [i][j] ,  [j][i] 이렇게 바꿔주면 행 합, 열 합을 구할 수 있다.

대각선의 경우, 인덱스가 같으면 좌상우하 대각선이다.

우상좌하 대각선의 경우 j 자리에  "크기-1-i" 를 하면 값을 쓰면 된다.

다른 방법으론 "i+j == 크기-1"   식을 사용하면 된다

 
 

import java.util.*;
import java.util.stream.IntStream;

class 격자판최대합 {
public static void main(String[] args){
int max = Integer.MIN_VALUE;
int n = 10;

int[][] arr = IntStream.range(0, n)
.mapToObj(index->{
return new Random().ints(n, 1, 100)
.toArray();
}).toArray(int[][]::new);
prettyPrint(arr);

int rowSum, colSum, cSum1=0,cSum2=0;

for(int i= 0; i<n; i++) {
rowSum=0;
colSum=0;
//핵심 같은 반복문이라도 구조가 유사하니
//j , i 위치만 바꾸면 한방에 해결
//구조 i==j , i+j == length-1 , [고정][순회], [순회],[고정]
for(int j= 0; j<n ;j++) {
rowSum += arr[i][j]; //같은 행 합
colSum += arr[j][i]; //같은 열 합
}
cSum1+=arr[i][i]; //좌상우하 대각선 for문 1개만 필요
cSum2+=arr[i][n-1-i]; //우상좌하 대각선

// 내가 틀린 부분 기존 값이 신규 값보다 더 클 수 있다는 것을 간과
// max = rowSum<colSum ? colSum : rowSum;
max = max < rowSum ? rowSum
: max < colSum ? colSum : max ;
}
max = max < cSum1 ? cSum1
: max < cSum2 ? cSum2 : max;

System.out.println(max);

}
static void prettyPrint(int[][] arr, boolean isIndex) {
for(int i=0;i<arr.length;i++) {
for(int j=0;j<arr[i].length;j++) {
if(isIndex) System.out.printf("%2d,%2d ", i,j);
else System.out.printf("%2d" + (j==arr[i].length-1? "":",") ,arr[i][j]);
}
System.out.println(isIndex?"\n":"");
}
}
static void prettyPrint(int[][] arr) {
prettyPrint(arr, false);
}
}

 

'자료구조&알고리즘 > 자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비' 카테고리의 다른 글

두배열합치기  (0) 2022.11.17
중복문자제거  (0) 2022.11.14
숫자뒤집기  (0) 2022.11.10
봉우리  (0) 2022.11.09
등수구하기  (0) 2022.11.05

+ Recent posts