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

C++로 N차 대칭 행렬 만들기: 각 행에 0부터 N-1까지의 숫자를 포함하고 주대각선은 0으로 채우기

개요

이 글에서는 C++를 사용하여 N차(N×N) 대칭 행렬을 생성하는 방법을 알아봅니다. 생성해야 할 행렬의 조건은 다음과 같습니다.

  • 각 행에는 0부터 N-1까지의 숫자가 포함되어야 합니다.
  • 주대각선(main diagonal)의 모든 요소는 항상 0이어야 합니다.

예를 들어 N이 5라면, 첫 번째 행은 0, 1, 2, 3, 4가 되고, 두 번째 행은 자기 자신의 위치(대각선)만 0이며 나머지는 순서대로 숫자가 채워집니다.

알고리즘 접근 방식

이 문제는 비교적 간단하게 해결할 수 있습니다. 핵심 로직은 다음과 같습니다.

  1. N×N 크기의 2차원 배열(행렬)을 선언합니다.
  2. 각 행 i에 대해 카운터 변수를 1로 초기화합니다.
  3. 각 열 j를 순회하면서 i와 j가 같으면 해당 위치를 0으로 설정하고, 그렇지 않으면 현재 카운터 값을 저장한 후 카운터를 1씩 증가시킵니다.

이 방식을 사용하면 대각선 요소는 항상 0이 되고, 나머지 위치는 각 행마다 1부터 N-1까지 차례대로 채워져 자연스럽게 대칭 구조가 완성됩니다.

C++ 구현 코드

#include <iostream>
using namespace std;

void makeSymmetricMatrix(int n) {
    int matrix[n][n];
    
    // 행렬 값 채우기
    for (int i = 0; i < n; i++) {
        int count = 1;
        for (int j = 0; j < n; j++) {
            if (i == j) {
                matrix[i][j] = 0;   // 주대각선은 0
            } else {
                matrix[i][j] = count++;  // 1부터 N-1까지 순차적으로 저장
            }
        }
    }
    
    // 결과 출력
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cout << matrix[i][j] << " ";
        }
        cout << endl;
    }
}

int main() {
    int n = 5;
    makeSymmetricMatrix(n);
}

실행 결과

0 1 2 3 4
1 0 2 3 4
1 2 0 3 4
1 2 3 0 4
1 2 3 4 0

코드 설명

makeSymmetricMatrix 함수는 매개변수로 받은 n 크기만큼의 정방 행렬을 생성합니다. 내부 동작을 단계별로 살펴보면 다음과 같습니다.

  • 바깥쪽 반복문은 행(row) 인덱스 i를 순회하며, 행이 바뀔 때마다 count를 1로 초기화합니다.
  • 안쪽 반복문은 열(column) 인덱스 j를 순회하면서 i == j, 즉 대각선 위치인 경우 0을 저장합니다.
  • 대각선이 아닌 위치에는 count 값을 저장한 후 후위 증가 연산자(count++)로 값을 1씩 올립니다.
  • 마지막으로 이중 반복문을 사용하여 완성된 행렬 전체를 화면에 출력합니다.

복잡도 분석

  • 시간 복잡도: O(N²) — N×N 크기의 모든 요소를 한 번씩 방문하기 때문입니다.
  • 공간 복잡도: O(N²) — 결과를 저장할 N×N 크기의 행렬이 필요합니다.

마무리

이처럼 대각선 여부만 판단하면 되는 간단한 조건 검사를 통해 원하는 대칭 행렬을 손쉽게 만들 수 있습니다. 이러한 패턴은 그래프의 인접 행렬 초기화나 거리 행렬 생성 등 다양한 알고리즘 문제에서 응용될 수 있으므로, 기본 개념을 잘 익혀두면 유용합니다.