728x90
반응형
9. 격자판 최대합
설명
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
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner kb=new Scanner(System.in);
int n = kb.nextInt();
int[][] arr = new int[n][n];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
arr[i][j]= kb.nextInt();
}
}
System.out.println(solution(n, arr));
}
static int solution(int n, int[][] arr){
//i) 각 행의 합
//ii) 각 열의 합
//iii) 두 대각선의 합
int answer=0;
//i) 각 행의 합
int sum1=0;
int sum2=0;
for(int i=0;i<n;i++){
sum1=0;
for(int j=0;j<n;j++){
sum1+=arr[i][j];
}
sum2=Math.max(sum1, sum2);
}
//ii) 각 열의 합
for(int i=0;i<n;i++){
sum1=0;
for(int j=0;j<n;j++){
sum1+=arr[j][i];
}
sum2=Math.max(sum1, sum2);
}
//iii) 두 대각선의 합
//0,0 1,1, 2,2, 3,3, .... n,n
//5,0, 4,1, 3,2, 2,3 1,4 0,5
sum1=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i==j)
sum1+=arr[i][j];
}
}
sum2=Math.max(sum1, sum2);
sum1=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i+j==n-1)
sum1+=arr[i][j];
}
}
sum2=Math.max(sum1, sum2);
return sum2;
}
}
import java.util.Scanner;
public class Main {
public int solution(int[][] arr){
int max=Integer.MIN_VALUE;
int n=arr.length;
int sum=0;
for(int i=0;i<n;i++){
sum=0;
for(int j=0;j<n;j++){
sum+=arr[i][j];
}
max=Math.max(max,sum);
}
for(int i=0;i<n;i++){
sum=0;
for(int j=0;j<n;j++){
sum+=arr[j][i];
}
max=Math.max(max,sum);
}
for(int i=0;i<n;i++){
sum=0;
for(int j=0;j<n;j++){
if(i+j==2*i)
sum+=arr[j][i];
}
max=Math.max(max,sum);
}
for(int i=0;i<n;i++){
sum=0;
for(int j=0;j<n;j++){
if(i+j==n-1)
sum+=arr[j][i];
}
max=Math.max(max,sum);
}
return max;
}
public static void main(String[] args){
Main T = new Main();
Scanner kb=new Scanner(System.in);
int n = kb.nextInt();
int[][] arr=new int[n][n];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
arr[i][j]=kb.nextInt();
}
}
System.out.println(T.solution(arr));
}
}
import java.util.*;
public class Main {
public int solution(int n, int[][] arr){
ArrayList<Integer> list = new ArrayList<>();
int sum=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i+j==n) sum+=arr[i][j];
}
}
list.add(sum);
sum=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i==j) sum+=arr[i][j];
}
}
list.add(sum);
sum=0;
for(int i=0;i<n;i++){
sum=0;
for(int j=0;j<n;j++){
sum+=arr[i][j];
}
list.add(sum);
}
for(int i=0;i<n;i++){
sum=0;
for(int j=0;j<n;j++){
sum+=arr[j][i];
}
list.add(sum);
}
int answer=0;
for(int x:list) answer=Math.max(x, answer);
return answer;
}
public static void main(String[] args){
Main T = new Main();
Scanner kb=new Scanner(System.in);
int n = kb.nextInt();
int[][] arr = new int[n][n];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
arr[i][j]=kb.nextInt();
System.out.println(T.solution(n, arr));
}
}
+) 세련된 코드
import java.util.*;
class Main {
public int solution(int n, int[][] arr) {
int answer = -2147000000;
int sum1 = 0, sum2 = 0;
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];
}
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 kb = new Scanner(System.in);
int n = kb.nextInt();
int[][] arr = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
arr[i][j] = kb.nextInt();
}
}
System.out.print(T.solution(n, arr));
}
}
#최댓값 찾기
1. Math.max로 최댓값 찾기
int sum1=0, sum2=0;
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];
}
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);
2. list에 넣고, max 꺼내기
public int solution(int n, int[][] arr){
ArrayList<Integer> list = new ArrayList<>();
int sum=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i+j==n) sum+=arr[i][j];
}
}
list.add(sum);
sum=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i==j) sum+=arr[i][j];
}
}
list.add(sum);
sum=0;
for(int i=0;i<n;i++){
sum=0;
for(int j=0;j<n;j++){
sum+=arr[i][j];
}
list.add(sum);
}
for(int i=0;i<n;i++){
sum=0;
for(int j=0;j<n;j++){
sum+=arr[j][i];
}
list.add(sum);
}
int answer=0;
for(int x:list) answer=Math.max(x, answer);
return answer;
}
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int n = in.nextInt();
int[][] arr = new int[n][n];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
arr[i][j]=in.nextInt();
}
}
//격자판 최대합
//대각선 두개, 행 총합, 열 총합 비교
int answer=Integer.MIN_VALUE;
for(int i=0;i<n;i++){
int sum=0;
for(int j=0;j<n;j++){
sum+=arr[i][j];
}
answer=Math.max(sum,answer);
}
for(int i=0;i<n;i++){
int sum=0;
for(int j=0;j<n;j++){
sum+=arr[j][i];
}
answer=Math.max(sum,answer);
}
int sum=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i+j==n) sum+=arr[i][j];
}
}
answer=Math.max(sum,answer);
sum=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i==j) sum+=arr[i][j];
}
}
answer=Math.max(sum,answer);
System.out.println(answer);
}
}
-> 이중for문하나, for문 하나로 리팩토링
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int n = in.nextInt();
int[][] arr = new int[n][n];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
arr[i][j]=in.nextInt();
}
}
//격자판 최대합
//대각선 두개, 행 총합, 열 총합 비교
int answer=Integer.MIN_VALUE;
int sum1=0, sum2=0;
for(int i=0;i<n;i++){
sum1=0;
sum2=0;
for(int j=0;j<n;j++){
sum1+=arr[j][i];
sum2+=arr[i][j];
}
answer=Math.max(answer,sum1);
answer=Math.max(answer,sum2);
}
sum1=0;
sum2=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i+j==n) sum1+=arr[i][j];
if(i==j) sum2+=arr[i][j];
}
}
answer=Math.max(sum1,answer);
answer=Math.max(sum2,answer);
System.out.println(answer);
}
}
728x90
반응형
'Java > Java 알고리즘 인프런' 카테고리의 다른 글
[Ch.02 - Array] 11. 임시반장 정하기 (0) | 2022.05.19 |
---|---|
[Ch.02 - Array] 10. 봉우리 (0) | 2022.05.18 |
[Ch.02 - Array] 08. 등수 구하기 (+ Arrays.sort와 fill) (0) | 2022.05.18 |
[Ch.02 - Array] 07. 점수계산 (0) | 2022.05.18 |
[Ch.02 - Array] 06. 뒤집은 소수 (+ 숫자 뒤집기 : while, %10, /10) (0) | 2022.05.18 |