문제
설명
5*5 격자판에 아래롸 같이 숫자가 적혀있습니다.
N*N의 격자판이 주어지면 각 행의 합, 각 열의 합, 두 대각선의 합 중 가 장 큰 합을 출력합니다.
입력
첫 줄에 자연수 N이 주어진다.(2<=N<=50)
두 번째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어진다. 각 자연수는 100을 넘지 않는다.
출력
최대합을 출력합니다.
내 풀이
import java.util.Scanner;
public class Main2_9 {
public int Solution(int n, int[][] arr) {
int max=Integer.MIN_VALUE;
int[] sum = new int[2*n+2];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
sum[i] += arr[i][j]; // 각 행의 합
sum[i+n] += arr[j][i]; // 각 열의 합
if(i==j) sum[n+n] += arr[i][i]; // 우측 하향 대각선의 합
sum[n+n+1] = arr[i][n-(i+1)]; // 좌측 하향 대각선의 합
}
}
for (int i = 0; i < sum.length; i++) {
if(sum[i]>max) max=sum[i];
}
return max;
}
public static void main(String[] args) {
Main2_9 T = new Main2_9();
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
int[][] arr = new int[num][num];
for (int i = 0; i < num; i++) {
for (int j = 0; j < num; j++) {
arr[i][j] = sc.nextInt();
}
}
System.out.println(T.Solution(num, arr));
}
}
5*5 격자판을 예시로 들자면,
sum[0]~sum[4] 까지 n개는 각 행의 합, sum[5]~sum[9] 까지 n개는 각 열의 합, sum[10]은 우하향 대각선의 합, sum[11]은 좌하향 대각선의 합을 넣고 sum 배열 (각 행의 합, 각 열의 합, 두 대각선의 합) 중 가 장 큰 합을 출력한다.
(n이 바뀌더라도 sum배열을 2*n+2만큼 만들어주기 때문에 비슷한 원리로 적용된다)
우하향 대각선의 합, 좌하향 대각선의 합은 i변수로만 접근하기 때문에 선생님 풀이랑 비슷하다고 볼 수 있을 것 같다.
내가 혼자 풀어내서 너무 기분 좋았음 !
선생님 풀이
import java.util.Scanner;
public class Main2_9 {
public int Solution(int n, int[][] arr) {
int answer = Integer.MIN_VALUE;
int sum1, sum2;
for (int i = 0; i < n; i++) {
sum1=sum2=0; // sum1 : 행의 합, sum2 : 열의 합
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; // sum1 : 우측 하향 대각선의 합, sum2 : 좌측 하향 대각선의 합
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;
}
public static void main(String[] args) {
Main2_9 T = new Main2_9();
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
int[][] arr = new int[num][num];
for (int i = 0; i < num; i++) {
for (int j = 0; j < num; j++) {
arr[i][j] = sc.nextInt();
}
}
System.out.println(T.Solution(num, arr));
}
}
결과
'Algorithm > Inflearn' 카테고리의 다른 글
[Inflearn] 자바 알고리즘 문제풀이 #02-10 10. 봉우리 (2) | 2022.11.22 |
---|---|
[Inflearn] 영리한 프로그래밍을 위한 알고리즘 - 순환 (Recursion) 의 응용 : Counting Cells in a Blob (0) | 2022.11.21 |
[Inflearn] 자바 알고리즘 문제풀이 #02-08 8. 등수구하기 (0) | 2022.11.21 |
[Inflearn] 영리한 프로그래밍을 위한 알고리즘 - 순환 (Recursion) 의 응용 : 미로찾기 (1) | 2022.11.16 |
[Inflearn] 자바 알고리즘 문제풀이 #02-07 7. 점수계산 (0) | 2022.11.16 |