이 글에서는 n×m 크기의 2차원 행렬이 주어졌을 때, C++ 프로그래밍으로 행렬 내 최대 요소(최댓값)를 찾는 방법을 알아보겠습니다.
문제 설명
주어진 행렬에서 가장 큰 값을 가진 요소를 찾아 반환하는 것이 목표입니다. 별도의 복잡한 조건 없이 단순히 행렬 전체를 탐색하여 최댓값을 구하는 기본적인 문제입니다.
예제로 문제 이해하기
입력
mat[3][3] = {{4, 1, 6},
{5, 2, 9},
{7, 3, 0}}출력
9
위 예제에서 행렬의 모든 요소 중 가장 큰 값은 9이므로 출력 결과는 9가 됩니다.
해결 접근 방법
이 문제의 해결 방법은 매우 직관적입니다. 핵심 아이디어는 다음과 같습니다.
- 행렬의 첫 번째 요소(
mat[0][0])를 초기 최댓값인 maxVal로 설정합니다. - 두 개의 중첩 반복문을 사용하여 행렬의 모든 요소를 순회합니다.
- 순회 중 현재 요소가 maxVal보다 크면 해당 값으로 maxVal을 갱신합니다.
- 탐색이 끝나면 최종 maxVal을 반환합니다.
이 방식은 행렬의 크기가 n×m일 때 시간 복잡도가 O(n×m)이며, 공간 복잡도는 O(1)로 추가 메모리가 거의 필요하지 않아 효율적입니다.
C++ 구현 코드
아래는 위 해결 방법을 실제로 구현한 프로그램입니다.
#include <iostream>
using namespace std;
#define n 3
#define m 3
int CalcMaxVal(int mat[n][m]) {
int maxVal = mat[0][0];
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (mat[i][j] > maxVal)
maxVal = mat[i][j];
return maxVal;
}
int main(){
int mat[n][m] = {{4, 1, 6},{5, 2, 9},{7, 3, 0}};
cout<<"행렬의 최대 요소는 "<<CalcMaxVal(mat);
return 0;
}실행 결과
행렬의 최대 요소는 9
코드 동작 원리 상세 분석
- 초기화:
maxVal을 행렬의 첫 번째 요소로 초기화하여, 음수만 포함된 행렬에서도 올바르게 동작하도록 합니다. 만약 0으로 초기화하면 모든 요소가 음수인 경우 잘못된 결과가 나올 수 있습니다. - 중첩 반복문: 바깥쪽 반복문(i)은 행(row)을, 안쪽 반복문(j)은 열(column)을 순회하여 행렬의 모든 위치를 한 번씩 방문합니다.
- 비교 및 갱신: 각 요소를 현재 최댓값과 비교하여 더 큰 값이 발견되면 즉시 갱신합니다.
마무리
행렬의 최댓값 찾기는 배열 탐색의 기본기를 익힐 수 있는 대표적인 문제입니다. 이와 유사하게 최솟값을 찾거나, 각 행·열별 최댓값을 구하는 등의 변형 문제에도 동일한 탐색 기법을 활용할 수 있으니 응용해 보시기 바랍니다.