코딩테스트 및 알고리즘
격자판 최대합
영카이브
2023. 12. 17. 15:04
문제 . N*N의 격자판이 주어지면 각 행의 합, 각 열의 합, 두 대각선의 합 중 가 장 큰 합을 출력합니다
입력예시 :
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
나의 답변
import java.util.Scanner;
public class Main {
public int solution(int n, int[][] arr){
int answer = 0;
int temp=0;
int sum1, sum2;
for( int y=0; y<n; y++ ) {
sum1=0; sum2=0;
for( int x=0; x<n; x++) {
sum1+=arr[y][x];
sum2+=arr[x][y];
}
temp=Math.max(sum1,sum2);
if(temp>answer)answer=temp;
}
sum1=0; sum2=0;
temp=0;
for( int i=0; i<n; i++ ) {
sum1+=arr[i][i];
sum2+=arr[n-1-i][i];
}
temp=Math.max(sum1, sum2);
if(temp>answer)answer=temp;
return answer;
}
public static void main(String[] args) {
Main T = new Main();
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] arr = new int[n][n];
for( int y=0; y<n; y++ ) {
for( int x=0; x<n; x++ ) {
arr[y][x]=sc.nextInt();
}
}
System.out.println(T.solution(n, arr));
}
}
답은 바르게 나오나 코드가 비효율적이다.
가독성이 좀더 좋게 바꾸고 불필요하게 코드를 반복하지 않도록 줄였다.
정정답변
public class Main {
public int solution(int n, int[][] arr) {
int answer = 0;
// 각 행과 열의 합을 저장할 배열
int[] rowSum = new int[n];
int[] colSum = new int[n];
int diagonalSum1 = 0;
int diagonalSum2 = 0;
// 행, 열, 대각선의 합을 계산
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
rowSum[i] += arr[i][j];
colSum[j] += arr[i][j];
if (i == j) {
diagonalSum1 += arr[i][j];
}
if (i + j == n - 1) {
diagonalSum2 += arr[i][j];
}
}
}
// 최대값 찾기
for (int i = 0; i < n; i++) {
answer = Math.max(answer, rowSum[i]);
answer = Math.max(answer, colSum[i]);
}
answer = Math.max(answer, diagonalSum1);
answer = Math.max(answer, diagonalSum2);
return answer;
}
public static void main(String[] args) {
Main T = new Main();
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] arr = new int[n][n];
for (int y = 0; y < n; y++) {
for (int x = 0; x < n; x++) {
arr[y][x] = sc.nextInt();
}
}
System.out.println(T.solution(n, arr));
}
}