격자판 최대합 - (2차원 배열 행, 열, 두 대각선 합 구하기)


2차원 배열 행과 열의 합, 두 대각선 합 구하기



👉  행과 열의 갯수가 같은 n * m 배열이 주어졌을 때, 각 행의 합, 각 열의 합, 두 대각선의 합 중 최대값을 구하는 문제이다.

문제에서 제시하는 그대로 각 행의 합, 각 열의 합, 두 대각선 중 가장 큰 값을 구하면 된다.

그럼 이를 코르돌 풀어보자.

코드


function solution(arr) {
    let answer = Number.MIN_SAFE_INTEGER;
    let n = arr.length;
    let sum1 = sum2 = 0;

    for (let i = 0; i < n; i++) {
        for (let j = 0; j < n; j++) {
            sum1 += arr[i][j];   ... 1
            sum2 += arr[j][i];   ... 2
        }
        answer = Math.max(answer, sum1, sum2);   ... 3
				sum1 = sum2 = 0;
    }

    sum1 = sum2 = 0;   ... 4

    for (let i = 0; i < n; i++) {
        sum1 += arr[i][i];   ... 5
        sum2 += arr[i][n - i - 1];   ... 6 
    }

    answer = Math.max(answer, sum1, sum2);

    return answer;
}

let arr = [
    [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],
];
console.log(solution(arr));

👉  위의 코드를 살펴보자.

  1. i = 0, j가 0부터 4까지 돌면서 sum1에 첫 행에 있는 값들을 더해준다.

  2. 1에서처럼 sum2에 첫 열에 있는 값들을 더해준다.

  3. answer와 sum1, sum2를 더해준다. Math.max 함수를 이용하여 최댓값을 answer에 넣어준다.
    이를 배열의 길이만큼 반복하여 모든 행, 열 중 최대값을 구할 수 있다.

  4. 값 비교가 끝났다면 sum1과 sum2를 0으로 초기화 해준다.

  5. 왼쪽 위에서 오른쪽 아래로 향하는 대각선은 행과 열의 인덱스가 같기 때문에 i를 넣어주면 된다.

  6. 오른쪽 위에서 왼쪽 아래로 향하는 대각선은 행은 i 열은 배열의 마지막 인덱스에서 i만큼 빼면 값을 얻을 수 있다.

대각선의 합을 구할 때, 한 개의 인덱스 값을 이용하여 구할 수 있다는 걸 생각하지 못했었다. 앞으로 이를 잘 활용해야겠다.

출처 - 자바스크립트 알고리즘 문제풀이

좋은 웹페이지 즐겨찾기