[백준 10814번 C/C++] 나이순 정렬
목차
[백준 10814번 C/C++] 나이순 정렬
https://www.acmicpc.net/problem/10814
해결전략
vector에 구조체 변수(struct Tag)를 넣은 후 정렬한다. 이 때 bool Compare 함수를 만들어 원하는 모양으로 정렬해준다.
주의할점
- vector<Tag> v에 값을 넣어줄 때는
- v.push_back( Tag { 값1, 값2, 값3 } ) 과 같은 모양으로 넣어줘야 한다.
- Tag 뒤의 값들은 중괄호 { }를 사용해서 넣어주어야 한다.
코드
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
struct Tag
{
int age;
string name;
int joinOrder;
};
bool Compare(const Tag& a, const Tag& b)
{
if (a.age == b.age)
return a.joinOrder < b.joinOrder;
return a.age < b.age;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
cin >> n;
vector<Tag> v(n);
for (int i = 0; i < n; i++) {
cin >> v[i].age >> v[i].name;
v[i].joinOrder = i;
}
sort(v.begin(), v.end(), Compare);
for (int i = 0; i < n; i++) {
cout << v[i].age << " " << v[i].name << "\n";
}
return 0;
}
주의사항) 입력방법에 따라 vector 사이즈를 미리 할당해야 하는 경우가 있다.
입력방법 1.
vector<Tag> v;//전방 선언
int main(){
//...
v. reserve(n);//vector 사이즈를 할당
for (int i = 0; i < n; i++) {
cin >> v[i].age >> v[i].name;
v[i].joinOrder = i;
}
//...
}
- 위의 경우 입력 시 v[ i ]의 형태로 입력을 받는다. 따라서 vector의 사이즈를 제대로 할당하지 않으면 입력 시 문제가 된다.
입력방법 2.
vector<Tag> v;//전방 선언
int main(){
//...
for (int i = 0; i < n; i++) {
int a;
string b;
cin >> a >> b;
v.push_back(Tag{ a, b, i });
}
//...
}
- 입력방법1과 달리 입력방법2에서는 push_back을 사용하였다. push_back을 사용하면 데이터를 밀어 넣으면서 메모리가 할당되니 굳이 vector 사이즈를 미리 할당할 필요가 없다.
입력방법2를 사용한 코드
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
struct Tag
{
int age;
string name;
int joinOrder;
};
bool Compare(const Tag& a, const Tag& b)
{
if (a.age == b.age)
return a.joinOrder < b.joinOrder;
return a.age < b.age;
}
vector<Tag> v;
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
cin >> n;
for (int i = 0; i < n; i++) {
int a;
string b;
cin >> a >> b;
v.push_back(Tag{ a, b, i });
}
sort(v.begin(), v.end(), Compare);
for (const auto& it : v) {
cout << it.age << " " << it.name << "\n";
}
return 0;
}
다른 방법의 풀이
#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;
map<int, vector<string>> myMap;
int main(void){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n, age;
string name;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> age >> name;
myMap[age].push_back(name);
}
for (auto& it : myMap)
{
for (auto i : it.second)
{
cout << it.first << " " << i << "\n";
}
}
return 0;
}
map을 사용한 방법의 풀이다.
'⭐ 코딩테스트 > 백준' 카테고리의 다른 글
[백준 2805번 C/C++] 나무 자르기 (0) | 2023.06.27 |
---|---|
[백준 1654번 C/C++] 랜선 자르기 (0) | 2023.06.26 |
[백준 10816번 C/C++] 숫자 카드 2 (0) | 2023.06.23 |
[백준 1021번 C/C++] 회전하는 큐 (0) | 2023.06.22 |
[백준 2331번 C/C++] 반복수열 (0) | 2023.06.22 |
댓글
이 글 공유하기
다른 글
-
[백준 2805번 C/C++] 나무 자르기
[백준 2805번 C/C++] 나무 자르기
2023.06.27 -
[백준 1654번 C/C++] 랜선 자르기
[백준 1654번 C/C++] 랜선 자르기
2023.06.26 -
[백준 10816번 C/C++] 숫자 카드 2
[백준 10816번 C/C++] 숫자 카드 2
2023.06.23 -
[백준 1021번 C/C++] 회전하는 큐
[백준 1021번 C/C++] 회전하는 큐
2023.06.22