[백준 C++] 10814번 : 나이순 정렬
https://www.acmicpc.net/problem/10814
10814번: 나이순 정렬
온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을
www.acmicpc.net
풀이 :
- 나이 <= 200, 동일한 값이 나올 경우 먼저 등록한 사람 먼저 출력
- 배열[나이]에 스텍으로 저장하면 정렬할 필요가 없다
코드 :
#include <iostream>
#include <vector>
using namespace std;
struct info{
int age;
char name[105];
};
int main(){
int n;
vector<vector<info>>v(205);
info info;
cin >> n;
for(int i=0; i<n; i++){
scanf("%d %s", &info.age, info.name);
v[info.age].push_back(info);
}
for(int i=0; i<201; i++){
if(v[i].size() > 0){
for(int j=0; j<v[i].size(); j++){
printf("%d %s\n", v[i][j].age, v[i][j].name);
}
}
}
}
- 나이와 이름을 같이 저장하기 위해 구조체 선언
- 해당 구조체를 가지는 2차원 벡터 선언
- 입력 받을 구조체 info선언
- 나이, 이름을 입력 받은 info를 벡터에 삽입
- 0부터 200까지 배열의 길이가 0 이상인 경우
즉, 입력 받은 나이가 있는 경우 그 길이 만큼(중복됐을 경우) 출력
후기 :
제일 처음 코드는 조건을 설정해서 정렬을 해줬고 시간 초과가 났다.
아무래도 cin, cout 때문인 것 같은데 scanf를 쓰기 위해선 char배열로 받아야 했다.
char배열 보다는 string이 익숙하다 보니 계속 오류가 났다.
set으로도 구상을 해보고 다양한 방법을 구상하다가 이 방법이 제일 구현하기 쉬울 것 같았다.
다만 여기서도 char배열로 받고, 출력하는게 어려워서 string을 쓰고 cin,cout을 썼는데,
또 시간 초과가 났다.
char배열을 입력받고 출력 할 때 %c를 써야 한다고 생각했는데 %s를 써야 한다는 것,
배열이다보니 입력 받을 때도 &가 필요없다는 것을 다시 한번 상기시킬 수 있었다.
그리고 백터에 구조체를 넣는 방법은 처음 써봐서 여기서도 어려움이 있었다.
거기다 2차원으로 하려고 하니 더 어려웠는데 새로운 것들을 써볼 수 있는 좋은 기회였다.
- cin.tie(NULL);
ios::sync_with_stdio(false);
를 넣어서 cin, cout을 쓰면서도 시간 단축하는 것 잊지 말기