Array #9. 격자판 최대합
카테고리 : TIL (Tody I Learned) >> Algorithm
인프런 자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비 수강 중
문제:
N * N 격자판이 주어졌을 때 각 행의 합, 각 열의 합, 각 대각선의 합 중 가장 큰 합 출력
내 코드:
public int solution(int n, int[][] arr){
int sum = 0;
int max = 0;
//행 총합
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
sum += arr[i][j];
}
max = Math.max(max, sum);
sum = 0;
}
//열 총합
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
sum += arr[j][i];
}
max = Math.max(max, sum);
sum = 0;
}
//대각선 총합
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(i == j) sum += arr[i][j];
}
}
max = Math.max(max, sum);
sum = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(i + j == n - 1) sum += arr[i][j];
}
}
max = Math.max(max, sum);
return max;
}
- 행 총합 구하기
- 열 총합 구하기
- 대각선 총합 구하기
max
메서드를 이요해 가장 큰 값만 변수에 담기- 가장 큰 값 반환
다른 방법
인프런 자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비 답 참조
public int solution(int n, int[][] arr){
int ans = 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];
}
ans = Math.max(ans, sum1);
ans = Math.max(ans, sum2);
}
sum1 = sum2 = 0;
for(int i = 0; i < n; i++) {
sum1 += arr[i][i];
sum2 += arr[i][n - i - 1];
}
ans = Math.max(ans, sum1);
ans = Math.max(ans, sum2);
return ans;
}
- 방식은 동일
- 행 총합 구할 때 열 총합 같이 구하기
- 대각선 총합 구할 때 2개 같이 구하기
개선된 점:
- 시간을 신경쓰지 않았다
- 행 총합 구할 때 열 총합도 같이 구할 수 있다
- 대각선 총합 구할 때 굳이 이중
for
문 돌릴 필요 없음 - 대각선 2개도 하나의
for
문으로 구할 수 있다.
끝!