[백준 BOJ] 5635번 생일 (C++/cpp)

2022. 8. 29. 22:19PS (Program Solving)/BOJ (백준)

문제 설명

https://www.acmicpc.net/problem/5635

 

5635번: 생일

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

www.acmicpc.net

백준 BOJ 5635번 생일 문제 사진

 

접근 방법 - 정렬의 심화 문제

백준의 5635번 문제는 정렬에 관하여 좀 더 심화적인 부분을 다루고 있는 문제이다.

해당 문제는, 학생들의 생일과 이름이 입력으로 주어졌을 때 나이가 가장 적은 사람과 가장 많은 사람의 이름을 출력해야 하는 문제이다.

필자의 경우엔 구조체 배열과 정렬 함수를 이용하여 해당 문제를 해결해보았다.

각 생일의 요소와 이름을 구조체 멤버로 두고 미리 정의해둔 compare 함수를 통하여 구조체 배열을 정렬한 것이다.

이 원리에 대해 어느 정도 이해한다면 해당 문제를 푸는 데에는 어렵지 않았을 것으로 예상된다.

다만 처음 접하였을 땐 상당히 생소하기 때문에, 만약 이러한 경우엔 아래의 설명과 코드를 참고해보길 바란다.

필자는 아래의 순서대로 코드를 작성하여 문제를 해결하였다.

 

코드의 실행 순서

1) Student 구조체를 만들어 이름과 생일을 멤버로 둔다.

 

2) Student 타입의 배열(stu)을 전역 변수에 선언해둔다.

 

3) 학생의 수(n)와 학생의 정보(stu)를 순차적으로 입력받는다.

 

4) sort() 함수를 이용하여 stu의 생일에 대하여 오름차순 정렬을 한다.

이때, 아래처럼 compare 함수를 선언한 뒤 이를 이용하여 구조체 정렬을 수행하게끔 한다.

(bool형으로 반환하여 각 경우에 대해 위치 변경이 필요한지 아닌지를 결정하게끔 compare 함수를 설정하였다.)

 

5) 정렬한 결과에 따라, 나이가 가장 적은 사람과 많은 사람을 순차적으로 출력한 뒤 실행 종료한다.

반응형

 

성공한 코드

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <iostream>
#include <algorithm>
#define endl '\n'
using namespace std;

//백준 5635번 코드
struct Student {
	string name;
	int day;
	int month;
	int year;
};

bool compare(Student s1, Student s2) {
	if (s1.year == s2.year) {
		if (s1.month == s2.month) {
			return s1.day < s2.day;
		}
		return s1.month < s2.month;
	}
	return s1.year < s2.year;
}

Student stu[101];
int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);	cout.tie(NULL);

	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> stu[i].name;
		cin >> stu[i].day >> stu[i].month >> stu[i].year;
	}
	sort(stu, stu + n, compare);
	
	cout << stu[n - 1].name << endl;
	cout << stu[0].name << endl;
}

 

제출 결과

백준 BOJ 5635번 생일 문제 C++ 제출 결과

(2022.07.28 백준 5635번 문제 제출 결과)

반응형