PS_Baekjoon

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

SMILELY 2023. 2. 24. 18:59

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을 쓰면서도 시간 단축하는 것 잊지 말기