문제
N*N의 격자판이 주어지면 각 행의 합, 각 열의 합, 두 대각선의 합 중 가 장 큰 합을 출력합니다.
입력
첫 줄에 자연수 N이 주어진다.(2<=N<=50)
두 번째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어진다. 각 자연수는 100을 넘지 않는다.
출력
최대합을 출력합니다.
예시 입력
5
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
예시 출력
155
내 풀이
private static int getMaxSum(int num, int[][] nums) {
int[] sumOfRow = new int[num]; // 행
int[] sumOfCol = new int[num]; // 열
int[] sumOfDia = new int[2]; // 대각선
for (int i = 0; i < num; i++) {
for (int j = 0; j < num; j++) {
sumOfRow[i] += nums[i][j];
sumOfCol[j] += nums[i][j];
if (i == j) sumOfDia[0] += nums[i][j];
if (i + j == num - 1) sumOfDia[1] += nums[i][j];
}
}
return Stream.of(sumOfRow, sumOfCol, sumOfDia)
.flatMapToInt(Arrays::stream)
.max()
.orElse(0);
}
줄마다 값을 저장했다가 한 번에 최대값을 찾는다
다른 풀이
public static int solution(int n, int[][] arr) {
int answer = -2147000000;
int sum1 = 0, sum2 = 0;
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;
}
합을 저장하지 않고 한 줄마다 최대값을 확인한다
기억할 점
2차원 배열 선언
// 선언
int[][] array; // 주로 사용
int array[][];
int[] array[];
// 선언과 초기화
int[][] array = new int[4][3]; // 기본값으로 초기화
// 가변배열, 행마다 다른길이
int[][] array = new int[2][];
array[0] = new int[2];
array[1] = new int[3];
// 선언과 초기화2
// 배열의 크기는 자동으로 계산
int[][] array = new int[][] {
{1, 2},
{3, 4, 5},
};
// 선언과 초기화3
// new int[][] 생략가능
int[][] array = {
{1, 2},
{}, // 빈 배열, 길이가 0
{3, 4, 5},
}
//괄호 안의 마지막 요소 쉼표가능
{{1, 2}} == {{1, 2,},}
// 2차원 배열 값 확인
System.out.println(Arrays.deepToString(array));
'Java > Coding-Test' 카테고리의 다른 글
[Java] 2-11 임시반장 정하기 (0) | 2022.01.18 |
---|---|
[Java] 2-10 봉우리 (0) | 2022.01.18 |
[Java] 2-5 소수(에라토스테네스 체) (0) | 2022.01.18 |
[Java] 2-4 피보나치 수열 (0) | 2022.01.17 |
[Java] 1-12 암호 (0) | 2022.01.16 |
댓글