이것저것 공부한 기록

C++) 백준 10814번 풀이_나이순 정렬 본문

Study/프로그래밍 문제풀이

C++) 백준 10814번 풀이_나이순 정렬

블랜디 2019. 11. 7. 16:11

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

 

10814번: 나이순 정렬

온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 작성하시오.

www.acmicpc.net

cin/cout을 쓸 경우 절대적으로 시간 초과가 난다.

scanf/printf로 사용해야 하는데

입력값에 string이 있어서 이런데 익숙하지가 않아서 헤멨다.

 

또한 입력값으로 string을 받아오긴 하지만 정렬에 사용하지 않는다.

정렬에는 나이순->입력순서만 사용하는데,

 

 

코딩 기초 부족 티 팍팍 남. . ...

 

string의 경우 일단 그대로 scanf는 불가.

 

scanf("%s",str.c_str());

 

억지로 하려면 이런 모양새로 할 수 있긴 한 것 같은데, 절대 추천하지 않는다고.

 

char배열로 받아와서 string으로 복사해넣는 수밖에 없다.

아니면 getline이나 cin쓰던가.

 

printf는 위 c_str()함수로 해결 가능하다.

 

 

그리고.... class를 sort하려고 하니 사용자 정의 함수를 이용한 방법이 있었다

들어오는 순서대로 index를 넣어서, age가 같으면 index로 비교하여 출력하게끔 해봤다

 

첫 코드

#include <stdio.h>
#include <algorithm>
#include <vector>
#include <string>

using namespace std;

class Member
{
public:
	int age;
	int index;
	string name;
	Member(int index, int age, char* name) :index(index), age(age), name(name) {}
};

bool compare(Member a, Member b)
{
	if (a.age == b.age)
	{
		return a.index < b.index;
	}
	else
	{
		return a.age < b.age;
	}
}

int main()
{
	int cnt, age;
	char name[100];
	scanf("%d", &cnt);
	vector<Member> members;

	for (int i = 0; i < cnt; ++i)
	{
		scanf("%d", &age);
		scanf("%s", name);
		members.push_back(Member(i, age, name));
	}

	sort(members.begin(), members.end(), compare);

	for (int i = 0; i < cnt; ++i)
	{
		printf("%d %s\n", members[i].age, members[i].name.c_str());
	}
}

 

근데 막상 정답 받고 나니까 너무 비효율적이고 ㅠ

입력값이 좀 더 많은 경우에는 쓸만하겠다만 고작 age랑 name 두개 들어오는데 index까지 추가해서 이난리를 치고 있는게 과연 합당한가 하는 생각이 들어 다른 사람들의 코드를 확인했는데,, ,,,

 

나이별로 vector를 생성하여 그냥 집어넣으면 sort고 뭐고 아무것도 필요없었다

띠바

 

혹은 뭐... fifo로 queue를 써도 나쁘진 않을 것 같음

 

#include <stdio.h>
#include <algorithm>
#include <vector>
#include <string>

using namespace std;

int main()
{
	vector<string> members[201];
	int cnt, age;
	char name[100];
	scanf("%d", &cnt);

	for (int i = 0; i < cnt; ++i)
	{
		scanf("%d", &age);
		scanf("%s", name);
		members[age].push_back(name);
	}

	for (int i = 1; i < 201; ++i)
	{
		if (!members[i].empty())
		{
			for (int j = 0; j < members[i].size(); ++j)
			{
				printf("%d %s\n", i, members[i][j].c_str());
			}
		}
	}
}

 

뭐 무튼 공부한 이후로 처음 class를 사용해봤다는데 의의를 두자

(훌쩍)