배열은 여러 개의 요소를 담을 수 있는 자료구조이며, 배열에서 가장 큰 요소란 나머지 모든 요소보다 값이 큰 요소를 의미합니다.
예시로 이해하기
다음 배열을 살펴보겠습니다.
| 5 | 1 | 7 | 2 | 4 |
위 배열에서 가장 큰 요소는 7이며, 인덱스 2에 위치해 있습니다.
그렇다면 배열에서 가장 큰 요소와 그 위치를 찾으려면 어떻게 해야 할까요? 전체 코드는 다음과 같습니다.
전체 코드
#include <iostream>
using namespace std;
int main() {
int a[] = {4, 9, 1, 3, 8};
int largest, i, pos;
largest = a[0];
for(i=1; i<5; i++) {
if(a[i]>largest) {
largest = a[i];
pos = i;
}
}
cout<<"배열에서 가장 큰 요소는 "<<largest<<"이고, 인덱스 "<<pos<<"에 위치합니다";
return 0;
}실행 결과
배열에서 가장 큰 요소는 9이고, 인덱스 1에 위치합니다
코드 동작 원리
위 프로그램에서 a[]는 5개의 요소를 가진 배열이며, 변수 largest에는 배열의 최댓값이 저장되고, pos에는 해당 요소의 인덱스가 저장됩니다.
먼저 largest에 배열의 첫 번째 요소를 저장한 뒤, 인덱스 1부터 마지막 요소까지 순회하는 for 루프를 시작합니다. 루프가 한 번 반복될 때마다 현재까지의 최댓값 largest와 a[i]를 비교하여, a[i]가 더 크면 그 값을 largest에 저장하고 해당 인덱스 i를 pos에 저장합니다.
핵심 로직은 다음 코드 조각과 같습니다.
for(i=1; i<5; i++) {
if(a[i]>largest) {
largest = a[i];
pos = i;
}
}루프가 모두 끝나면 largest에는 배열 전체에서 가장 큰 값이, pos에는 그 요소의 인덱스가 들어 있게 됩니다. 마지막으로 이 두 값을 화면에 출력합니다.
cout<<"배열에서 가장 큰 요소는 "<<largest<<"이고, 인덱스 "<<pos<<"에 위치합니다";
정리
이 알고리즘은 배열을 딱 한 번만 순회하므로 시간 복잡도는 O(n)이며, 추가로 사용하는 변수가 상수 개수뿐이므로 공간 복잡도는 O(1)입니다. 즉, 배열의 크기가 커져도 선형 시간 안에 효율적으로 최댓값을 찾을 수 있는 가장 기본적이면서도 널리 쓰이는 방법입니다.