백준 5635 - 생일

2 minute read

문제링크

문제 접근

  • 첫번째 접근은 구조체를 활용하는 방법이었다. 구조체에 이름, 일, 월, 연도 정보를 담을 수 있도록 변수를 선언하고 벡터 컨테이너에 담는다. 그리고 sort 함수를 활용하여 나이순으로 정렬하려고 했다. 하지만, 연도순으로 정렬한 후 월순, 일순으로 정렬하는 부분이 상당히 까다로웠다. 그래서 접근 방법을 전격 수정했다.
  • 제출에 성공했던 답안의 접근은 연도, 월, 일 에 가중치를 설정해주는 방법이었다. 한국식 나이에서 중요한 순서는 연도->월->일 이기 때문에 월수의 차이가 연도의 차이를 넘어설 수 없을 정도의 가중치, 마찬가지로 일수의 차이가 월수의 차이를 넘어설 수 없을 정도의 가중치를 설정해야했다.
  • 예를 들어, 연도의 가중치 1000, 월의 가중치 50, 일의 가중치 1 인 경우 1월과 12월의 최대 차이는 11*50 = 550 < 1000, 1일과 31일의 최대 차이는 30 < 50, 월과 일의 최대 차이값 550+30 = 580 < 1000 (연도의 가중치) 이므로 각 분야에서의 차이가 서로의 영역에 영향을 주지 않는다.
  • 나이를 해당 가중치를 대입하여 계산한 후, 내림차순으로 나열하면 나이가 가장 적은 사람부터 정렬된다.

의사코드(pseudo-code)

# function
- bool cmp(const pair<string, int>& p1, const pair<string, int>& p2)
	- return p1.second > p2.second
# main
- int n
- scanf("%d", &n)
- vector<pair<string, int>> student(n)
- for i=0 to n-1 do:
	- int tmp[3] = {0, }
	- cin >> student[i].first >> tmp[0] >> tmp[1] >> tmp[2]
	- student[i].second = tmp[2]*1000 + tmp[1]*50 + tmp[0]
- sort(student.begin(), studen.end(), cmp)
- cout << student[0].first << "\n" << student[n-1].first << endl

소스코드 및 분석

전체 코드

#include <iostream>
#include <utility>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;

// 내림차순 정렬
bool cmp(const pair<string, int>& p1, const pair<string, int>& p2) {
	return p1.second > p2.second;
}

int main()
{
	int n;
	scanf("%d", &n);
	vector<pair<string, int>> student(n);
	for (int i = 0; i < n; i++) {
		int tmp[3] = { 0, };
		cin >> student[i].first >> tmp[0] >> tmp[1] >> tmp[2]; // 이름, dd, mm, yyyy 순서로 입력
		student[i].second = tmp[2] * 1000 + tmp[1] * 50 + tmp[0]; // 가중치를 대입하여 나이값 계산
	}
	sort(student.begin(), student.end(), cmp);
	cout << student[0].first << "\n" << student[n - 1].first << endl;
}
  • utility 헤더파일에 속해있는 pair 자료형을 vector 컨테이너와 함께 활용하였다.

다른 답안

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

typedef struct _student {
	string name;
	int day;
	int month;
	int year;
} Student;

// 나이가 많은 순서 정렬
bool cmp(const Student& s1, const Student& s2) {
	if (s1.year != s2.year)
		return s1.year < s2.year;
	if (s1.month != s2.month)
		return s1.month < s2.month;
	if (s1.day != s2.day)
		return s1.day < s2.day;
}

int main(void)
{
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);

	int n;
	cin >> n;
	
	vector<Student> sarr(n);
	for (int i = 0; i < n; i++) {
		cin >> sarr[i].name >> sarr[i].day >> sarr[i].month >> sarr[i].year;
	}
	sort(sarr.begin(), sarr.end(), cmp);
	
	cout << sarr[n-1].name << endl << sarr[0].name << endl;
	return 0;
}

Leave a comment