이 알고리즘 문제는 인프런의 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 (김태원)의 문제입니다.
문제 설명
코드
처음 작성한 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class sec02_09 {
public static int solution(int N, int[][] numArr) {
int rightUp = 0;
for(int i = 0; i < N; ++i)
{
int colSum = 0;
for(int j = 0; j < N; ++j)
{
colSum += numArr[j][i];
if(i + j == N - 1) rightUp += numArr[i][j];
}
numArr[N][i] = colSum;
}
int max = 0;
for(int i = 0; i < N; ++i) if(max < numArr[i][N]) max = numArr[i][N];
for(int i = 0; i < N; ++i) if(max < numArr[N][i]) max = numArr[N][i];
if(max < rightUp) max = rightUp;
return max;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[][] arr = new int[N + 1][N + 1];
int rightDown = 0;
for(int i = 0; i < N; ++i) {
StringTokenizer st = new StringTokenizer(br.readLine());
int rowSum = 0;
for(int j = 0; j < N; ++j)
{
arr[i][j] = Integer.parseInt(st.nextToken());
rowSum += arr[i][j];
if(i == j) rightDown += arr[i][j];
}
arr[i][N] = rowSum;
}
arr[N][N] = rightDown;
System.out.println(solution(N, arr));
}
}
개선한 코드
package inflearn_algorithm.chapter2;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class sec02_09 {
public static int solution(int N, int[][] numArr) {
int max = 0;
int rightUp = 0;
int rightDown = 0;
for (int i = 0; i < N; ++i)
{
int rowSum = 0;
int colSum = 0;
for (int j = 0; j < N; ++j)
{
rowSum += numArr[i][j];
colSum += numArr[j][i];
if (i == j) rightDown += numArr[i][j];
if (i + j == N - 1) rightUp += numArr[i][j];
}
max = Math.max(max, rowSum);
max = Math.max(max, colSum);
}
max = Math.max(max, rightDown);
max = Math.max(max, rightUp);
return max;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[][] arr = new int[N][N];
for (int i = 0; i < N; ++i)
{
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; ++j) arr[i][j] = Integer.parseInt(st.nextToken());
}
System.out.println(solution(N, arr));
}
}
개선된 코드에 대한 설명
- 초기 변수 설정
max 변수는 최댓값을 저장하기 위해 사용된다.
rightUp 변수는 오른쪽 위 대각선의 합을 저장한다.
rightDown 변수는 오른쪽 아래 대각선의 합을 저장한다. - 이중 반복문을 통한 합 계산
외부 반복문 for (int i = 0; i < N; ++i)는 행을 기준으로 반복한다.
내부 반복문 for (int j = 0; j < N; ++j)는 열을 기준으로 반복한다.
rowSum 변수는 현재 행의 합을 계산한다.
colSum 변수는 현재 열의 합을 계산한다.
if (i == j) 조건문을 통해 오른쪽 아래 대각선(rightDown)의 합을 계산한다.
if (i + j == N - 1) 조건문을 통해 오른쪽 위 대각선(rightUp)의 합을 계산한다. - 최대값 갱신
각 행의 합(rowSum)과 각 열의 합(colSum)을 계산한 후, 현재의 max 값과 비교하여 최대값을 갱신한다. - 대각선의 합과 비교
오른쪽 아래 대각선의 합(rightDown)과 오른쪽 위 대각선의 합(rightUp)을 계산한 후, 현재의 max 값과 비교하여 최대값을 갱신한다. - 최종 결과 반환
최종적으로 계산된 최대값(max)을 반환한다.
'자료구조 & 알고리즘 > Inflearn' 카테고리의 다른 글
[인프런 알고리즘] Chpater 2, 11번 문제(임시반장 정하기) (0) | 2024.07.19 |
---|---|
[인프런 알고리즘] Chpater 2, 10번 문제(봉우리) (0) | 2024.07.18 |
[인프런 알고리즘] Chpater 2, 8번 문제(등수 구하기) (0) | 2024.07.16 |
[인프런 알고리즘] Chapter 2, 7번 문제(점수 계산) (0) | 2024.07.15 |
[인프런 알고리즘] Chapter 2, 6번 문제(뒤집은 소수) (1) | 2024.07.14 |