문제

9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오.

예를 들어, 서로 다른 9개의 자연수

3, 29, 38, 12, 57, 74, 40, 85, 61

이 주어지면, 이들 중 최댓값은 85이고, 이 값은 8번째 수이다.

  • 입력
    • 첫째 줄부터 아홉 번째 줄까지 한 줄에 하나의 자연수가 주어진다. 주어지는 자연수는 100 보다 작다.
  • 출력
    • 첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 몇 번째 수인지를 출력한다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(void){
    vector<int> v;

    for (int i = 1; i <= 9; i++){
        int n;
        cin >> n;

        v.push_back(n);
    }

    int max = *max_element(v.begin(), v.end()); 
    int max_index = max_element(v.begin(), v.end()) - v.begin();

    cout << max << endl;
    cout << max_index + 1 << endl;

    return 0;
}

접근 및 풀이

이 문제는 vector를 더 유용하게 쓰기 위해 vector로 풀어보았다. 모든 수를 vector에 집어넣은 뒤 vector의 최댓값이나 최솟값을 직접 구하는 함수가 없는지 찾아보았는데, <algorithm> 헤더에 최댓값을 구하는 함수가 있었다.

max_element()가 바로 그것인데, 이 링크를 확인해 보면 리턴값이 iterator인 것을 알 수 있다. iterator라고 해봤자 포인터라고 생각하면 된다. 이 리턴값이 최댓값을 가진 배열의 요소를 가리키는 포인터이기 때문에 바로 가져올 수는 없고 *iter를 이용해 해당 값을 참조하여 가져와야 한다. 그리고 배열의 주소는 이어져 있기 때문에 인덱스 값을 가져올 때도 가장 첫 요소와 비교해서 가져올 수 있다.

댓글남기기