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

JavaScript로 행렬 주대각선 요소의 곱 구하기

2차원 배열로 표현된 정방행렬(정사각 행렬)이 다음과 같이 있다고 가정해 보겠습니다.

const arr = [
    [1, 3, 4, 2],
    [4, 5, 3, 5],
    [5, 2, 6, 4],
    [8, 2, 9, 3]
];

이 배열을 입력받아 행렬의 주대각선(principal diagonal)에 있는 요소들의 곱을 반환하는 함수를 작성해야 합니다.

주대각선이란 행렬에서 왼쪽 위에서 오른쪽 아래로 이어지는 대각선을 의미하며, 행 인덱스와 열 인덱스가 동일한 위치(i === j)의 요소들을 가리킵니다.

위 배열에서 주대각선에 해당하는 요소들은 다음과 같습니다.

1, 5, 6, 3

따라서 기대하는 출력 결과는 다음과 같습니다.

90

예제 코드

다음은 이중 반복문을 사용해 주대각선 요소의 곱을 계산하는 코드입니다.

const arr = [
    [1, 3, 4, 2],
    [4, 5, 3, 5],
    [5, 2, 6, 4],
    [8, 2, 9, 3]
];
const diagonalProduct = arr => {
    let product = 1;
    for(let i = 0; i < arr.length; i++){
        for(let j = 0; j < arr[i].length; j++){
            if(i === j){
                product *= arr[i][j];
            };
        };
    };
    return product;
};
console.log(diagonalProduct(arr));

출력 결과

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

90

코드 설명

동작 원리를 단계별로 살펴보면 다음과 같습니다.

1. 곱을 저장할 변수 product를 1로 초기화합니다. 곱셈의 항등원인 1로 시작해야 올바른 결과를 얻을 수 있습니다.
2. 바깥쪽 반복문은 행(row)을, 안쪽 반복문은 열(column)을 순회합니다.
3. 조건문 i === j를 통해 행 인덱스와 열 인덱스가 일치하는 경우, 즉 주대각선에 위치한 요소만 곱셈에 포함시킵니다.
4. 모든 순회가 끝나면 누적된 곱을 반환합니다.

성능 개선 팁

주대각선 요소만 필요하다면 사실 이중 반복문 없이 단일 반복문으로도 충분히 해결할 수 있습니다. arr[i][i]에 바로 접근하면 불필요한 비교 연산을 줄여 시간 복잡도를 O(n²)에서 O(n)으로 개선할 수 있습니다.

const diagonalProduct = arr => {
    let product = 1;
    for(let i = 0; i < arr.length; i++){
        product *= arr[i][i];
    };
    return product;
};

두 방식 모두 동일한 결과인 90을 반환하지만, 행렬의 크기가 커질수록 후자의 방법이 훨씬 효율적입니다.