정수로 이루어진 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));알고리즘 동작 원리
위 코드의 동작 방식을 단계별로 살펴보면 다음과 같습니다.
- 최댓값 사전 계산: 첫 번째 이중 반복문을 통해 각 행의 최댓값(
rowMax)과 각 열의 최댓값(colMax)을 미리 구해 저장합니다. - 조건 검사: 두 번째 이중 반복문에서 각 요소가 해당 행의 최댓값이면서 동시에 해당 열의 최댓값인지 확인합니다.
- 개수 반환: 두 조건을 모두 만족하는 요소의 개수를 카운트하여 최종적으로 반환합니다.
이 알고리즘은 행과 열의 개수를 각각 m, n이라 할 때 시간 복잡도가 O(m × n)으로 매우 효율적입니다. 또한 빈 배열이 입력될 경우 0을 반환하도록 예외 처리까지 포함되어 있어 안정적으로 동작합니다.
출력 결과
콘솔 출력 결과는 다음과 같습니다.
3