문제
- 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. sum1과 sum2를 선언한다.
- sum1 : 가로의 합을 저장할 변수
- sum2 : 세로의 합울 저장할 변수
6. i부터 N까지 도는 for문을 돌면서 sum1과 sum2를 0으로 초기화한다.
- 다음 행(가로)과 열(세로)의 합을 구하기 위해 초기화한다.
- 1행의 합을 구하고, 2행을 구하려면 해당 값을 0으로 초기화해야한다.
7. j부터 N까지 도는 for문을 통해 sum1과 sum2에 각각 값을 넣는다.
- sum1은 행을 고정하고, 우측으로 이동하며 값을 더한다. 그래서 행인 [ i ] 를 고정하고, [ j ] 가 움직인다.
- sum2는 열을 고정하고 아래로 이동하며 값을 더한다. 그래서 열인 [ j ] 를 고정하고, [ i ] 가 움직인다.
- 아래 이미지를 참고하면 이해하기 편하다.
8. 이제 Math.max() 를 통해 결과값에 값을 저장한다.
- Math.max : 입력받은 두 개의 인자 중 작은 값을 리턴한다.
9. 지금까지 한 작업은 행과 열의 합을 구하는 작업이다. 이제 대각선의 합을 구해보자.
10. sum1과 sum2를 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) 알고리즘 문제풀이 : 코딩테스트 대비(김태원)강의를 참고하여 작성하였습니다.
'알고리즘 > 인프런' 카테고리의 다른 글
섹션 2. Array(1, 2차원 배열)_11. 임시반장 정하기 (0) | 2022.09.22 |
---|---|
섹션 2. Array(1, 2차원 배열)_10. 봉우리 (0) | 2022.09.21 |
섹션 2. Array(1, 2차원 배열)_8. 등수 구하기 (0) | 2022.09.20 |
섹션 2. Array(1, 2차원 배열)_7. 점수계산 (0) | 2022.09.19 |
섹션 2. Array(1, 2차원 배열)_6. 뒤집은 소수 (2) | 2022.09.19 |