Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 행렬의 상단 대각선과 하단 대각선 서로 바꾸는 방법

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

C++로 행렬의 상단 대각선과 하단 대각선 서로 바꾸는 방법

즉, 주대각선을 기준으로 오른쪽 위에 있는 요소들과 왼쪽 아래에 있는 요소들의 위치를 서로 교환하는 것입니다. 이 작업은 사실상 행렬의 전치(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)이 첫 번째 열로 이동한 것을 확인할 수 있습니다. 이처럼 간단한 중첩 반복문만으로도 행렬의 상단과 하단 대각선 요소를 손쉽게 교환할 수 있습니다.