문제
온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 작성하시오.
입력
첫째 줄에 온라인 저지 회원의 수 N이 주어진다. (1 ≤ N ≤ 100,000)
둘째 줄부터 N개의 줄에는 각 회원의 나이와 이름이 공백으로 구분되어 주어진다. 나이는 1보다 크거나 같으며, 200보다 작거나 같은 정수이고, 이름은 알파벳 대소문자로 이루어져 있고, 길이가 100보다 작거나 같은 문자열이다. 입력은 가입한 순서로 주어진다.
출력
첫째 줄부터 총 N개의 줄에 걸쳐 온라인 저지 회원을 나이 순, 나이가 같으면 가입한 순으로 한 줄에 한 명씩 나이와 이름을 공백으로 구분해 출력한다.

나의 풀이
#include <stdio.h>
#include <stdlib.h>
typedef struct member { //구조체(인덱스, 나이, 이름 포함)
int index;
int age;
char name[101];
}member;
int cmp(member *i, member *j) { //비교 함수
if (i->age == j->age) return i->index - j->index;
return i->age - j->age;
}
int main(void) {
int n;
scanf("%d",&n);
member* arr = (member*)malloc(sizeof(member) * n);
for (int i = 0; i < n; i++) {
arr[i].index = i;
scanf("%d %s", &arr[i].age,arr[i].name);
}
qsort(arr, n, sizeof(member), cmp);
for (int i = 0; i < n; i++)
printf("%d %s\n", arr[i].age, arr[i].name);
free(arr);
}
구조체를 이용하면 쉬운 정렬 문제이다.
문제에서 주어진 조건은
1. 나이 오름차순 정렬
2. 나이가 같을 경우 입력순 정렬 인데,
qsort함수를 사용할 경우에는 생각을 조금 더 해주어야 한다.
qsort는 안정성을 보장하지 않기 때문에 입력 순서를 따로 판별해야 하기 때문이다.
이를 해결하기 위해 구조체에 나이, 이름을 입력받아올 때 인덱스 정보를 같이 넣어주었다.
그리고 qsort를 위해 정의해준 cmp함수에서,
나이가 같으면 인덱스 오름차순, 다를 경우 나이 오름차순으로 정렬되도록 지정해주면 끝.
아예 정렬을 하지 않고 출력만으로 해결하는 방법도 있다.
나이가 200보다 작다는 조건이 제시되었으므로,
나이를 1에서부터 199까지 for문으로 돌리고,
그 안쪽에서 구조체의 0부터 n-1까지 돌리며
구조체에 저장된 나이와 같을 경우 출력하는 방법이다.
위의 qsort 함수부터 for문까지의 코드를 다음으로 치환하면 된다.
for (int i=1;i<=200;i++)
{
for (int j=0;j<n;j++)
{
if (arr[j].age==i)
printf("%d %s\n", arr[j].age, arr[j].name);
}
자연스럽게 적은 나이부터 출력되고, 구조체 스캔 시에도 순서대로 스캔하기 때문에
나이가 적은+적을 경우 입력 순이라는 조건이 충족된다.
이 방법의 경우 compare 함수를 따로 정의하지 않아도 되고, 코드가 매우 간편해진다는 장점이 있지만
요소가 많아질수록 속도가 떨어지기 때문에 주의하여야 한다.
'프로그래밍 > 백준' 카테고리의 다른 글
[백준 C언어] 10866. 덱 (0) | 2023.01.05 |
---|---|
[백준 C언어] 10845. 큐 (0) | 2023.01.05 |
[백준 C언어] 1181. 단어 정렬 (0) | 2023.01.03 |
[백준 C언어] 10989. 수 정렬하기 3 (0) | 2023.01.03 |
[백준 C언어] 1475. 방 번호 (1) | 2023.01.02 |