by CodeJin19
1 min read

Categories

Tags

오늘의 문제는 “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;
}