/*
#include <stdio.h>
#include <string.h>
int q[201]={};
int front=-1,rear=-1;
void push(int d){
q[++rear]=d;
}
void front1(){
if(front==rear) printf("-1\n");
else {
printf("%d\n",q[++front]);
front--;
}
}
void back(){
if(front==rear) printf("-1\n");
else printf("%d\n",q[rear]);
}
void pop(){
if(front!=rear) front++;
}
void size(){
printf("%d\n",rear-front);
}
void empty(){
if(front==rear) printf("true\n");
else printf("false\n");
}
int main()
{
int n,i,j,l;
char s[10]={},k;
scanf("%d",&n);
for(i=0;i<n;i++){
char s[10]={};
scanf("%s",s);
if(s[0]=='p'){
if(s[1]=='u'){
scanf("%d %c",&l,&k);
push(l);
continue;
}
else{
pop();
continue;
}
}
else if(s[0]=='f'){
front1();
continue;
}
else if(s[0]=='b'){
back();
continue;
}
else if(s[0]=='s'){
size();
continue;
}
else if(s[0]=='e'){
empty();
continue;
}
}
return 0;
}
정렬 ( 오름차순 , 내림차순)
1. 코드 easy but 성능 bad (중첩반복문, 버블, 선택, 삽입)
2. 코드 hard but 성능 good (퀵, 병합, 기수, 힙, .....)
어떤 정렬이 항상 빠르다 or 느리다 (x)
입력되는 데이터에따라 다르다
버블정렬 ( 데이터가 어떻든, 몇개든 평등하게 느려, 코드가 easy)
5 1 4 2 3
i=1
1 5 4 2 3
1 4 5 2 3
1 4 2 5 3
1 4 2 3 : 5
i=2
1 4 2 3 : 5
1 2 4 3 : 5
1 2 3 : 4 5
i=3
1 2 : 3 4 5
i=4
1 2 3 4 5
데이터가 n개 -> n-1번 자리를 찾아줘야한다
a와 b값을 교환
a=b;
*/
/*
#include <stdio.h>
int a[10001];
int n, i, j, temp;
int main() {
scanf("%d", &n);
for (i=1; i<=n; i++)
scanf("%d", &a[i]);
for(i=1; i<n; i++)
{
for(j=1;j<=n-i;j++)
{
if (a[j] > a[j+1])
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
for (i = 1; i <= n; i++)
printf("%d\n", a[i]);
return 0;
}
*/
/*
#include <stdio.h>
int a[102];
int n, i, j, temp;
int main() {
scanf("%d", &n);
for (i=1; i<=n; i++)
scanf("%d", &a[i]);
for(i=1; i<n; i++)
{
for(j=n-1;j>=i;j--)
{
if (a[j] < a[j+1])
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
for (i = 1; i <= n; i++)
printf("%d ", a[i]);
return 0;
}
*/
/*
#include <stdio.h>
int a[10001];
int n, i, j, temp,k,l;
int main() {
scanf("%d", &n);
for (i=1; i<=n; i++)
scanf("%d", &a[i]);
for(i=1; i<n; i++)
{
k=0;
for(j=1;j<=n-i;j++)
{
if (a[j] > a[j+1])
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
k++;
}
}
if(k==0){
l=i-1;
break;
}
}
if(l==0) l++;
printf("%d",l);
return 0;
}
*/
/*
#include <stdio.h>
int a[10001];
int n, i, j, temp, min;
int main() {
scanf("%d", &n);
for (i = 1; i <= n; i++)
scanf("%d", &a[i]);
for (i=1; i<n; i++) {
min=i;
for (j=i+1; j<=n; j++) {
if(a[j]<a[min]) min=j;
}
temp = a[i];
a[i] = a[min];
a[min] = temp;
}
for (i=1; i<=n; i++)
printf("%d\n", a[i]);
return 0;
}
*/
/*
#include <stdio.h>
int a[102];
int n, i, j, temp, max;
int main() {
scanf("%d", &n);
for (i = 1; i <= n; i++)
scanf("%d", &a[i]);
for (i=1; i<n; i++) {
max=i;
for (j=i+1; j<=n; j++) {
if(a[j]>a[max]) max=j;
}
temp = a[i];
a[i] = a[max];
a[max] = temp;
}
for (i=1; i<=n; i++)
printf("%d ", a[i]);
return 0;
}
*/
/*
#include <stdio.h>
int a[10001];
int n, i, j, temp, key;
int main() {
scanf("%d", &n);
for (i = 1; i <= n; i++)
scanf("%d", &a[i]);
for (i=2; i<=n; i++)
{
key=a[i];
for(j=i-1;key<a[j]&&j>0;j--)
{
a[j+1]=a[j];
}
a[j+1]=key;
}
for (i=1; i<=n; i++)
printf("%d\n", a[i]);
return 0;
}
*/
/*
#include <stdio.h>
int a[10001];
int n, i, j, temp, key;
int main() {
scanf("%d", &n);
for (i = 1; i <= n; i++)
scanf("%d", &a[i]);
for (i=2; i<=n; i++)
{
key=a[i];
for(j=i-1;key>a[j]&&j>0;j--)
{
a[j+1]=a[j];
}
a[j+1]=key;
}
for (i=1; i<=n; i++)
printf("%d ", a[i]);
return 0;
}
구조체정렬
(1805) 1420 (3017) 3019
정렬 (버블,선택,삽입 아니고 메모이제이션활용)
(3014)
퀵정렬
1452
*/
/*
#include <stdio.h>
typedef struct{
int a;
int b;
}mac;
int main()
{
int n,i,j,t,k;
mac arr[101]={};
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d %d",&arr[i].a,&arr[i].b);
}
for(i=1; i<n; i++)
{
for(j=1;j<=n-i;j++)
{
if(arr[j].a>arr[j+1].a)
{
t=arr[j].a;
arr[j].a=arr[j+1].a;
arr[j+1].a=t;
k=arr[j].b;
arr[j].b=arr[j+1].b;
arr[j+1].b=k;
}
}
}
for(i=1;i<=n;i++){
printf("%d %d\n",arr[i].a,arr[i].b);
}
return 0;
}
*/
/*
#include <stdio.h>
typedef struct{
int num;
int ms;
int is;
}stu;
int main(){
int n,i,j;
stu a[1002]={}, t;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d %d",&a[i].ms,&a[i].is);
a[i].num=i;
}
for(i=1; i<n; i++)
{
for(j=1;j<=n-i;j++)
{
if(a[j].ms<a[j+1].ms||(a[j].ms==a[j+1].ms&&a[j].is<a[j+1].is)||(a[j].ms==a[j+1].ms&&a[j].is==a[j+1].is&&a[j].num>a[j+1].num))
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
for(i=1;i<=n;i++)
printf("%d %d %d\n",a[i].num,a[i].ms,a[i].is);
return 0;
}
*/
/*
#include <stdio.h>
int main()
{
int n,i,j,k,a[100001]={};
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&k);
a[k]++;
}
for(i=0;i<=100000;i++){
for(j=0;j<a[i];j++)
printf("%d ",i);
}
return 0;
}
#include <stdio.h>
#include <stdlib.h> //qsort 함수가 들어있음!
int a[5000]={5,7,3,10,2,1};
void q_s(int s, int e)// a[s] ~ a[e] 퀵정렬하세요
{
if(s>=e) return ;
int p = s;
int low=s+1;
int high=e;
//a[p]보다 작은수 --- a[p] ---- a[p]보다 큰수
while(low<high)
{
while(a[p]>a[low]) low++;
while(a[p]<a[high]) high--;
if(low>high) break;
//a[low] a[high]교환
int t = a[low];
a[low]=a[high];
a[high]=t;
}
int t = a[p];
a[p]=a[high];
a[high]=t;
q_s(s,high-1);
q_s(high+1,e);
}
int compare(int* pa, int* pb) // 1, 0, -1중 하나를 리턴 내림차순or오름차순을 결정하는 함수
{
if(*pa>*pb) return 1;
else if(*pa==*pb) return 0;
else return -1;
}
int main()
{
printf("before : ");
for(int i=0;i<6;i++){
printf("%d ",a[i]);
}
//q_s(0,5);
qsort(a,6,sizeof(int),compare);
//qsort(정렬할 배열의 첫번째원소의 주소, 정렬할 데이터 갯수, 정렬할 데이터의 크기, )
printf("\nafter : ");
for(int i=0;i<6;i++){
printf("%d ",a[i]);
}
}
*/
/*
#include <stdio.h>
#include <stdlib.h>
int a[100001]={};
int compare(int* pa,int* pb){
if(*pa>*pb) return 1;
else if(*pa==*pb) return 0;
else return -1;
}
int main()
{
int n,i;
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%d",&a[i]);
qsort(a,n,sizeof(int),compare);
for(i=0;i<n;i++) printf("%d\n",a[i]);
return 0;
}
*/
/*
#include <stdio.h>
#include <stdlib.h>
int a[100001]={};
int compare(int* pa,int* pb){
if(*pa>*pb) return -1;
else if(*pa==*pb) return 0;
else return 1;
}
int main()
{
int n,i;
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%d",&a[i]);
qsort(a,n,sizeof(int),compare);
for(i=0;i<n;i++) printf("%d ",a[i]);
return 0;
}
*/
#include <stdio.h>
typedef struct{
char na[100];
int y,m,d;
int t;
}sc;
// (*pa).t pa->t
int compare(sc* pa,sc* pb){
if(pa->t > pb->t) return -1;
else if(pa->t==pb->t){
return compare1();
}
else return 1;
}
int compare1(sc* pa,sc* pb){
int l=strlen(pa->na);
for(int i=0;i<l;i++){
if(strcmp(pa->na,pb->na)>0) return -1;
else if(strcmp(pa->na,pb->na)<0) return 1;
}
}
int main()
{
int n,i;
sc a[101]={};
scanf("%d\n",&n);
for(i=0;i<n;i++){
scanf("%s %d %d %d",a[i].na,&a[i].y,&a[i].m,&a[i].d);
a[i].t=10000*a[i].y+100*a[i].m+a[i].d;
}
qsort(a,n,sizeof(sc),compare);
for(i=0;i<n;i++){
printf("%s",a[i].na);
}
return 0;
}