본문 바로가기

알고리즘/인프런

섹션 2. Array(1, 2차원 배열)_9. 격자판 최대합

문제

  • 5*5 격자판에 아래와 같이 숫자가 적혀있습니다.
  • N*N의 격자판이 주어지면 각 행의 합, 각 열의 합, 두 대각선의 합 중 가 장 큰 합을 출력합니다.

입력

  • 첫 줄에 자연수 N이 주어진다.(2<=N<=50)
  • 두 번째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어진다. 각 자연수는 100을 넘지 않는다.

출력

  • 최대합을 출력합니다.

입출력 예제


풀이 방식을 정리해보자.

 

1. 자연수 N을 입력받고, N 개수만큼의 2차원 배열 num[ ][ ] 을 생성한다.

  • N * N 은 즉 2차원 배열을 의미한다.

2. 2중 for문을 통해서 2차원 배열에 값을 저장한다.

  • 2차원 배열이기에 i, j를 이용해서 2개의 좌표값을 사용한다.

3. 최대합을 구하는 메소드를 구현해보자.

 

4. 먼저 MIN_VALUE 를 사용해서 결과값을 저장할 변수인 result를 초기화한다.

  • MIN_VALUE : -2의 31제곱(-2,147,483,648) 으로 초기화해주는 메소드이다.

5. sum1sum2를 선언한다.

  • sum1 : 가로의 합을 저장할 변수
  • sum2 : 세로의 합울 저장할 변수

6. i부터 N까지 도는 for문을 돌면서 sum1sum2를 0으로 초기화한다. 

  • 다음 행(가로)과 열(세로)의 합을 구하기 위해 초기화한다.
  • 1행의 합을 구하고, 2행을 구하려면 해당 값을 0으로 초기화해야한다.

7. j부터 N까지 도는 for문을 통해  sum1과 sum2에 각각 값을 넣는다.

  • sum1은 행을 고정하고, 우측으로 이동하며 값을 더한다. 그래서 행인 [ i ] 를 고정하고, [ j ] 가 움직인다.
  • sum2는 열을 고정하고 아래로 이동하며 값을 더한다. 그래서 열인 [ j ] 를 고정하고, [ i ] 가 움직인다.
  • 아래 이미지를 참고하면 이해하기 편하다.

8. 이제 Math.max() 를 통해 결과값에 값을 저장한다.

  • Math.max : 입력받은 두 개의 인자 중 작은 값을 리턴한다.

9. 지금까지 한 작업은 행과 열의 합을 구하는 작업이다. 이제 대각선의 합을 구해보자.

 

10. sum1sum2를 0으로 초기화한다.

 

11. i부터 N까지 도는 for문을 작성하고, sum1과 sum2에 각각 값을 저장한다.

  • sum1에는 [ i ][ i ] 를 사용했는데, 이는 행과 열이 같은 (0,0) / (1,1) 좌표의 값들을 찾기 위해서이다.
  • sum2에는 [ i ][ N - i - 1 ] 를 사용했는데, 우측에서 좌측으로 가는 거꾸로 대각선의 값들을 찾기 위해서이다.
  • sum2에 있는 N - i - 1 은 강의에서 설명한 식으로, 만약 다른 수학적 공식을 찾았다면 그 방식으로 적용해도 된다.

12. 마찬가지로 Math.max를 통해 결과값을 저장한다.

 

수행 결과를 확인한다.


해당 글은 인프런 > 자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비(김태원)강의를 참고하여 작성하였습니다.