오늘의 문제는 “5635번 생일”.
n명의 사람의 이름과 생일을 입력받아 나이가 가장 적은 사람과 가장 많은 사람, 두 사람의 이름을 출력하는 쉬워보이는 정렬 문제다. 정렬을 사용하면 쉽게 풀릴 것 같아서 정렬을 사용하는 쪽으로 구현했다. 정렬을 위해 입력받은 생년월일을 하나의 숫자로 합쳤고, 마지막에는 이름 벡터의 인덱스를 붙였다.
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
int n, d, m, y, x;
string tmp;
vector <int> birth;
vector <string> name;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> tmp >> d >> m >> y;
//x : 년+월+일+이름벡터 인덱스
x = y;
x *= 100;
x += m;
x *= 100;
x += d;
x *= 10;
x += i;
name.push_back(tmp);
birth.push_back(x);
}
sort(birth.begin(), birth.end()); //생년월일로 정렬
x = birth[n - 1]; //맨 뒷자리의 인덱스 추출
x %= 10;
cout << name[x] << endl; //인덱스를 활용하여 이름 출력
x = birth[0];
x %= 10;
cout << name[x] << endl;
return 0;
}
예제도 출력 잘 되고, 메모리 문제 같아 보이지도 않았다. 잠시 고민하다가 정렬을 사용하지 않는 방향으로 다시 코딩했다. 이전과 같이 생년월일을 하나의 숫자로 묶어, 매 입력마다 생년월일의 최솟값과 최댓값을 찾아, 각 값의 인덱스를 최신화했다. 정렬을 사용하지 않았더니 간단히 풀렸다.
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
int n, d, m, y, x, max, min, maxidx, minidx;
string tmp;
vector <string> name;
cin >> n;
cin >> tmp >> d >> m >> y;
x = y;
x *= 100;
x += m;
x *= 100;
x += d;
max = x;
min = x;
maxidx = 0;
minidx = 0;
name.push_back(tmp);
for (int i = 1; i < n; i++)
{
cin >> tmp >> d >> m >> y;
x = y;
x *= 100;
x += m;
x *= 100;
x += d;
if (max < x)
{
max = x;
maxidx = i;
}
if (x < min)
{
min = x;
minidx = i;
}
name.push_back(tmp);
}
cout << name[maxidx] << endl;
cout << name[minidx] << endl;
return 0;
}