본문 바로가기

Java/Java 알고리즘 인프런

[Ch.02 - Array] 09. 격자판 최대합 (+ list, Math.max, 리팩토링) #

반응형
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);
  }
}
반응형