개요
이 글에서는 C++를 사용하여 N차(N×N) 대칭 행렬을 생성하는 방법을 알아봅니다. 생성해야 할 행렬의 조건은 다음과 같습니다.
- 각 행에는 0부터 N-1까지의 숫자가 포함되어야 합니다.
- 주대각선(main diagonal)의 모든 요소는 항상 0이어야 합니다.
예를 들어 N이 5라면, 첫 번째 행은 0, 1, 2, 3, 4가 되고, 두 번째 행은 자기 자신의 위치(대각선)만 0이며 나머지는 순서대로 숫자가 채워집니다.
알고리즘 접근 방식
이 문제는 비교적 간단하게 해결할 수 있습니다. 핵심 로직은 다음과 같습니다.
- N×N 크기의 2차원 배열(행렬)을 선언합니다.
- 각 행 i에 대해 카운터 변수를 1로 초기화합니다.
- 각 열 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 크기의 행렬이 필요합니다.
마무리
이처럼 대각선 여부만 판단하면 되는 간단한 조건 검사를 통해 원하는 대칭 행렬을 손쉽게 만들 수 있습니다. 이러한 패턴은 그래프의 인접 행렬 초기화나 거리 행렬 생성 등 다양한 알고리즘 문제에서 응용될 수 있으므로, 기본 개념을 잘 익혀두면 유용합니다.