Algorithm/백준

[백준] 10814 나이순 정렬 with C++

nowkoes 2023. 4. 14. 00:00

문제설명


입출력 예제


개념

 회원의 이름과 나이, 그리고 가입한 순서를 저장하는 구조체를 선언하고, 아래의 조건에 맞게 정렬하여 출력하는 문제다. 앞선 정렬 문제들과 같이 구조체와 연산자 오버로딩을 이용하여 풀었지만, 람다식도 이용하여 풀어보았다.

  • 나이 순으로 정렬
  • 나이가 같다면 가입한 순으로 정렬

풀이 (1)

#include <iostream>
#include <vector>
#include <algorithm>

struct User
{
	int _age, _index;
	std::string _name;
};

int main()
{
	int N;
	std::cin >> N;
	std::vector<User> v;

 User라는 구조체 안에 나이에 관한 _age, 순서에 관한 _index, 이름에 관한 _name을 선언한다. 그리고 메인 함수에서 회원의 수를 N으로 초기화하고, User를 자료형으로 갖는 벡터 v를 초기화한다.

 

 

	for (int i = 0; i < N; i++)
	{
		int age;
		std::string name;

		std::cin >> age >> name;

		v.push_back({ age, i + 1, name });
	}

 나이와 이름, 그리고 회원 순서를 입력받고 벡터 v에 push 해준다.

 

	struct
	{
		bool operator() (const User& u1, const User& u2)
		{
			if (u1._age == u2._age)
				return u1._index < u2._index;
			return u1._age < u2._age;
		}
	} custom;

	std::sort(v.begin(), v.end(), custom);

	for (User u : v)
		std::cout << u._age << ' ' << u._name << '\n';
}

 문제에서 제시한 조건에 맞게 정렬되도록 연산자 오버로딩을 하고, 정렬을 해주면 된다.

 

총합본

#include <iostream>
#include <vector>
#include <algorithm>

struct User
{
	int _age, _index;
	std::string _name;
};

int main()
{
	int N;
	std::cin >> N;
	std::vector<User> v;

	for (int i = 0; i < N; i++)
	{
		int age;
		std::string name;

		std::cin >> age >> name;

		v.push_back({ age, i + 1, name });
	}

	struct
	{
		bool operator() (const User& u1, const User& u2)
		{
			if (u1._age == u2._age)
				return u1._index < u2._index;
			return u1._age < u2._age;
		}
	} custom;

	std::sort(v.begin(), v.end(), custom);

	for (User u : v)
		std::cout << u._age << ' ' << u._name << '\n';
}

풀이 (2)

 같은 풀이를 람다식으로 교체해 보았다.

 

#include <iostream>
#include <vector>
#include <algorithm>

struct User
{
	int _age, _index;
	std::string _name;
};

int main()
{
	int N;
	std::cin >> N;
	std::vector<User> v;

	for (int i = 0; i < N; i++)
	{
		int age;
		std::string name;

		std::cin >> age >> name;

		v.push_back({ age, i + 1, name });
	}

	std::sort(v.begin(), v.end(), [](const User& u1, const User& u2)
		{
			if (u1._age == u2._age)
				return u1._index < u2._index;
			return u1._age < u2._age;
		});

	for (User u : v)
		std::cout << u._age << ' ' << u._name << '\n';
}

 코드의 길이가 짧아졌고, 가독성이 더 좋아진 듯한 느낌이다.

반응형

'Algorithm > 백준' 카테고리의 다른 글

[백준] 10815 숫자 카드 with C++  (0) 2023.04.16
[백준] 18870 좌표 압축 with C++  (0) 2023.04.15
[백준] 1181 단어 정렬 with C++  (0) 2023.04.13
[백준] 11650 with C++  (0) 2023.04.12
[백준] 1427 with C++  (0) 2023.04.11