Notice
Recent Posts
Recent Comments
Link
개발 공부~
[배열] 격자판 최대합 .java 본문
설명
5*5 격자판에 아래롸 같이 숫자가 적혀있습니다.
N*N의 격자판이 주어지면 각 행의 합, 각 열의 합, 두 대각선의 합 중 가 장 큰 합을 출력합니다.
입력
첫 줄에 자연수 N이 주어진다.(2<=N<=50)
두 번째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어진다. 각 자연수는 100을 넘지 않는다.
출력
최대합을 출력합니다.
예시 입력 1
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
예시 출력 1
155
내 풀이
1. 행의 합
: 각 행의 총 합은 바깥 for문 i를 고정해두고 arr[i][j]의 합을 구한 뒤 max 값과 비교 -> 하나의 행이 끝나면 sum 값 초기화
2. 대각선
: 오른쪽 아래로 가는 대각선 -> 0,1,2,3,4의 인덱스를 가지며 arr[i][i]로 행과 열의 값이 같은 인덱스만 더한다
: 오른쪽 위로가는 대각선 -> (0,4),(1,3),(2,2),(3,1),(4,0) -> i와 j의 합이 n-1임을 이용
3. 열의 합
: 열을 고정하고 행을 0~4까지 하면 된다 즉, arr[j][i]의 합
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] arr = new int[n][n];
for (int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
arr[i][j] = sc.nextInt();
}
}
int max = 0;
//행의 합
for (int i = 0; i < n; i++) {
int sum = 0;
for (int j = 0; j < n; j++) {
sum += arr[i][j];
if ( sum > max) {
max = sum;
}
}
}
//대각선1
int sum1 = 0;
for(int i = 0; i < n; i++) {
sum1 += arr[i][i];
}
max = Math.max(max, sum1);
//대각선 2
int sum2 = 0;
for(int i = 0; i < n ; i++) {
sum2 += arr[i][n-i-1];
}
max = Math.max(max, sum2);
//열의 합
for (int i = 0; i < n; i++) {
int sum3 = 0;
for (int j = 0; j < n; j++) {
sum3 += arr[j][i];
if ( sum3 > max) {
max = sum3;
}
}
}
System.out.println(max);
}
}
다른 풀이
내가 푼 방식의 간결한 버전이다
행과 열의 합을 함께 이중 for문으로, 두 대각선의 합을 함께 이중 for문으로 구한다
이후, 각 구한 총합과 현재 answer 변수 중 큰 값으로 갱신
import java.util.Scanner;
public class Main {
public int solution(int n, int[][] arr){
int answer = Integer.MIN_VALUE;
int sum1;//행의 합
int sum2 ;//열의 합
for(int i=0;i<n;i++){
sum1 = sum2 = 0;//하나의 행/열의 합 초기화
for(int j=0;j<n;j++){
sum1 += arr[i][j];//행 고정 -> 열만 변화 (j)
sum2 += arr[j][i];//열 고정 -> 행만 변화 (j)
}
//최댓값 갱신
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;
}
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 i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
arr[i][j] = sc.nextInt();
}
}
System.out.print(T.solution(n,arr));
}
}
💡💡
간결한 코드가 최고다
'코딩테스트 > 기타' 카테고리의 다른 글
[배열] 임시반장 정하기 .java (0) | 2024.10.22 |
---|---|
[배열] 봉우리 .java (0) | 2024.10.21 |
[배열] 등수구하기 .java (0) | 2024.10.20 |
[배열] 점수계산 .java (1) | 2024.10.16 |
[배열] 뒤집은 소수 .java (0) | 2024.10.16 |