행렬 전치(Transpose)란?
행렬(2차원 배열)의 전치(transpose)는 원본 행렬을 뒤집은 형태를 말합니다. 즉, 행렬의 행(row)과 열(column)을 서로 맞바꾸면 전치된 행렬을 얻을 수 있습니다.
예를 들어, 첫 번째 행이 [1, 1, 1]이었던 행렬을 전치하면 첫 번째 열이 [1, 1, 1]이 되는 식입니다. 이 과정은 대각선을 기준으로 요소들을 뒤집는 것과 같습니다.
동작 원리
가장 효율적인 방법은 새로운 배열을 만들지 않고 제자리(in-place)에서 요소를 교환(swap)하는 것입니다. 인덱스 i와 j에 대해 arr[i][j]와 arr[j][i]를 서로 바꾸되, j가 i보다 작은 경우만 순회하면 각 쌍이 한 번씩만 교환됩니다.
예제
구현 코드는 다음과 같습니다.
const arr = [
[1, 1, 1],
[2, 2, 2],
[3, 3, 3],
];
const transpose = arr => {
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < i; j++) {
const tmp = arr[i][j];
arr[i][j] = arr[j][i];
arr[j][i] = tmp;
};
}
}
transpose(arr);
console.log(arr);위 코드에서 내부 반복문의 조건이 j < i인 점에 주목하세요. 만약 j < arr.length로 설정하면 이미 교환된 요소를 다시 되돌려 놓게 되어 전치가 일어나지 않습니다.
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
[ [ 1, 2, 3 ], [ 1, 2, 3 ], [ 1, 2, 3 ] ]
원래 각 행이 동일한 값들로 이루어져 있었기 때문에, 전치 후에는 각 열의 값들이 한 행에 모여 [1, 2, 3] 형태의 행 세 개로 재배열된 것을 확인할 수 있습니다.