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을 반환하지만, 행렬의 크기가 커질수록 후자의 방법이 훨씬 효율적입니다.