M × N 크기의 행렬이 주어졌을 때, 이 행렬의 평균 벡터(mean vector)를 구하는 문제를 살펴보겠습니다. 평균 벡터란 각 열(column)별 평균값을 순서대로 나열한 벡터를 의미합니다.
문제 이해하기
예를 들어 다음과 같은 3×3 행렬이 있다고 가정해 보겠습니다.
| 1 | 2 | 3 |
| 4 | 5 | 6 |
| 7 | 8 | 9 |
이 행렬의 평균 벡터는 [4, 5, 6]입니다. 각 열의 평균을 계산하면 다음과 같습니다.
- 첫 번째 열: (1 + 4 + 7) / 3 = 4
- 두 번째 열: (2 + 5 + 8) / 3 = 5
- 세 번째 열: (3 + 6 + 9) / 3 = 6
예시에서 알 수 있듯이, 각 열의 평균값을 차례대로 모으면 곧 행렬의 평균 벡터가 됩니다.
C++ 구현 예제
아래 코드는 2차원 배열로 표현된 행렬을 입력받아, 각 열의 합계를 구한 뒤 행의 개수로 나누어 평균 벡터를 출력합니다.
#include<iostream>
#define M 3
#define N 3
using namespace std;
void calculateMeanVector(int mat[M][N]) {
cout << "[ ";
for (int i = 0; i < N; i++) {
double average = 0.00;
int sum = 0;
// i번째 열의 모든 요소를 합산
for (int j = 0; j < M; j++)
sum += mat[j][i];
average = (double)sum / M;
cout << average << " ";
}
cout << "]";
}
int main() {
int mat[M][N] = {{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};
cout << "Mean vector is: ";
calculateMeanVector(mat);
return 0;
}실행 결과
Mean vector is: [ 4 5 6 ]
코드 설명
- 외부 반복문(
i)은 열(column)을 순회하고, 내부 반복문(j)은 해당 열의 각 행(row) 요소를 방문합니다. - 내부 반복문에서
mat[j][i]로 접근하여 i번째 열의 모든 값을sum에 누적합니다. - 누적된 합계를 행의 개수
M으로 나누면 해당 열의 평균이 됩니다. 정수 나눗셈 오류를 방지하기 위해(double)형 변환을 사용하는 것이 좋습니다.
시간 복잡도
행렬의 모든 요소를 한 번씩 방문하므로 시간 복잡도는 O(M × N)이며, 추가 공간은 결과 벡터 저장에 O(N)만큼 필요합니다.