Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

자바스크립트로 2차원 배열에서 행과 열 모두에서 가장 큰 숫자의 개수 구하기

정수로 이루어진 2차원 배열을 유일한 인자로 받아 처리하는 자바스크립트 함수를 작성해야 합니다.

이 함수의 핵심 임무는 배열 내에서 자신이 속한 행(row)과 열(column) 양쪽 모두에서 가장 큰 값인 숫자가 총 몇 개인지 계산하고, 그 개수를 반환하는 것입니다.

문제 예시

예를 들어 입력 배열이 다음과 같다고 가정해 보겠습니다.

const arr = [
    [21, 23, 22],
    [26, 26, 25],
    [21, 25, 27]
];

이 경우 기대되는 출력 결과는 다음과 같습니다.

const output = 3;

그 이유는 조건을 만족하는 숫자가 바로 26, 26, 27의 세 개이기 때문입니다. 이 숫자들은 각각 자신이 속한 행과 열에서 동시에 최댓값에 해당합니다.

구현 코드

다음은 이 문제를 해결하는 전체 코드입니다.

const arr = [
    [21, 23, 22],
    [26, 26, 25],
    [21, 25, 27]
];
const countGreatest = (matrix = []) => {
    let rows = matrix.length;
    if (rows == 0){
        return 0;
    };
    let cols = matrix[0].length;
    const colMax = [];
    const rowMax = [];
    let res = 0;
    for (let r = 0; r < rows; ++ r) {
        for (let c = 0; c < cols; ++ c) {
            rowMax[r] = Math.max(rowMax[r] || 0, matrix[r][c]);
            colMax[c] = Math.max(colMax[c] || 0, matrix[r][c]);
        }
    };
    for (let r = 0; r < rows; ++ r) {
        for (let c = 0; c < cols; ++ c) {
            if (matrix[r][c] == rowMax[r] && matrix[r][c] == colMax[c]) {
                res ++;
            }
        }
    }
    return res;
};
console.log(countGreatest(arr));

알고리즘 동작 원리

위 코드의 동작 방식을 단계별로 살펴보면 다음과 같습니다.

  1. 최댓값 사전 계산: 첫 번째 이중 반복문을 통해 각 행의 최댓값(rowMax)과 각 열의 최댓값(colMax)을 미리 구해 저장합니다.
  2. 조건 검사: 두 번째 이중 반복문에서 각 요소가 해당 행의 최댓값이면서 동시에 해당 열의 최댓값인지 확인합니다.
  3. 개수 반환: 두 조건을 모두 만족하는 요소의 개수를 카운트하여 최종적으로 반환합니다.

이 알고리즘은 행과 열의 개수를 각각 m, n이라 할 때 시간 복잡도가 O(m × n)으로 매우 효율적입니다. 또한 빈 배열이 입력될 경우 0을 반환하도록 예외 처리까지 포함되어 있어 안정적으로 동작합니다.

출력 결과

콘솔 출력 결과는 다음과 같습니다.

3