문제

어떤 반에 있는 학생들의 생일이 주어졌을 때, 가장 나이가 적은 사람과 가장 많은 사람을 구하는 프로그램을 작성하시오.

  • 입력
    • 첫째 줄에 반에 있는 학생의 수 n이 주어진다. (1 ≤ n ≤ 100)
    • 다음 n개 줄에는 각 학생의 이름과 생일이 “이름 dd mm yyyy”와 같은 형식으로 주어진다. 이름은 그 학생의 이름이며, 최대 15글자로 이루어져 있다. dd mm yyyy는 생일 일, 월, 연도이다. (1990 ≤ yyyy ≤ 2010, 1 ≤ mm ≤ 12, 1 ≤ dd ≤ 31) 주어지는 생일은 올바른 날짜이며, 연, 월 일은 0으로 시작하지 않는다.
    • 이름이 같거나, 생일이 같은 사람은 없다.
  • 출력
    • 첫째 줄에 가장 나이가 적은 사람의 이름, 둘째 줄에 가장 나이가 많은 사람 이름을 출력한다.

코드

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

int main(void){
    int num = 0;

    cin >> num;

    vector<pair<pair<int, int>, pair<int, string> > > v(num);
    for (int i = 0; i < num; i++){
        cin >> v[i].second.second >> v[i].second.first >> v[i].first.second >> v[i].first.first;
    }

    sort(v.begin(), v.end());

    cout << v[num - 1].second.second << endl;
    cout << v[0].second.second << endl;

}

접근 및 풀이

11098 문제와 비슷하게 입력의 수를 미리 입력받고 그 뒤에 이름과 생년월일을 입력받는 방식이다. 생년월일을 한꺼번에 입력받는 게 아니라 년도와 월, 일을 다 따로 입력받기 때문에 여러 쌍을 입력받을 Vector가 필요했는데, pair 안에 pair를 집어넣을 수 있다는 것을 알게 되었다.

sort()의 정렬 방식은 first부터 오름차순으로 정렬하고, first의 값이 같을 경우 second를 정렬하는 방식이기 때문에 년도부터 비교할 수 있도록 입력받는 순서와는 반대로 vector에 넣어주었다.

가장 나이가 적은 사람은 정렬된 벡터 중 마지막 벡터에, 가장 나이가 많은 사람은 정렬된 벡터 중 첫번째 벡터에 있기 때문에 이름을 가져와 출력한다.

댓글남기기