이 튜토리얼에서는 C++ 코드를 사용하여 3x3 행렬(삼중 대각 배열)의 위쪽 삼각형 부분을 아래쪽 삼각형 부분과 맞바꾸는 방법을 다룹니다. 행렬이 입력으로 주어졌을 때, 우리가 원하는 결과는 아래와 같습니다.

즉, 주대각선을 기준으로 오른쪽 위에 있는 요소들과 왼쪽 아래에 있는 요소들의 위치를 서로 교환하는 것입니다. 이 작업은 사실상 행렬의 전치(transpose)와 동일한 원리로 수행됩니다.
알고리즘
전체 과정은 다음 알고리즘과 같이 정리할 수 있습니다.
1단계: 대각 행렬을 입력받는다
2단계: Swap() 함수에 전달한다
3단계: 외부 루프(i)를 n=3까지 반복한다
4단계: 내부 루프(j)를 j = i + 1부터 n=3까지 반복한다
5단계: arr[i][j] 값을 임시 변수 temp에 저장한다
6단계: arr[i][j] = arr[j][i] 로 값을 교환한다
7단계: temp 값을 arr[j][i]에 대입한다
8단계: for 루프를 이용해 결과 행렬을 출력한다
C++ 구현 예제
위에서 설명한 알고리즘에 따라 작성된 C++ 코드는 다음과 같습니다.
#include <iostream>
#define n 3
using namespace std;
// 대각선 기준으로 요소를 교환하는 함수
void swap(int arr[n][n]) {
// 행렬의 요소들을 교환하는 루프
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
int temp = arr[i][j];
arr[i][j] = arr[j][i];
arr[j][i] = temp;
}
}
// 행렬의 요소들을 출력하는 루프
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++)
cout << arr[i][j] << " ";
cout << endl;
}
}
// 프로그램 실행을 위한 드라이버 함수
int main() {
int arr[n][n] = {
{ 1, 2, 3},
{ 4, 5, 6},
{ 7, 8, 9},
};
cout << "입력::" << endl;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++)
cout << arr[i][j] << " ";
cout << endl;
}
// 함수 호출
cout << "출력(교환 후)::" << endl;
swap(arr);
return 0;
}
코드 핵심 포인트
- j = i + 1부터 시작: 내부 루프를 i+1부터 시작하면 주대각선(arr[i][i])은 그대로 두고, 대각선 위쪽 요소만 처리하게 됩니다.
- temp 변수 활용: 두 값을 안전하게 맞바꾸기 위해 임시 변수를 사용합니다.
- 시간 복잡도 O(n²): 행렬의 절반만 순회하므로 효율적입니다.
실행 결과
아래 출력 결과에서 볼 수 있듯이, 3x3 행렬의 위쪽 부분이 아래쪽 부분과 성공적으로 맞바뀌었습니다.
입력::
1 2 3
4 5 6
7 8 9
출력(교환 후)::
1 4 7
2 5 8
3 6 9
결과를 보면 원래 행렬의 첫 번째 행(1, 2, 3)이 첫 번째 열로 이동한 것을 확인할 수 있습니다. 이처럼 간단한 중첩 반복문만으로도 행렬의 상단과 하단 대각선 요소를 손쉽게 교환할 수 있습니다.