본문 바로가기

Algorithm/기타

점수를 이용한 이름 정렬 - 난이도(하)


  문제 - 점수 정렬


중간고사 후 시험 성적이 나왔다. 그러나 이름과 성적이 두서없이 섞여있다. 이를 점수가 높은 순으로 정렬한다.


Input 

 첫 번째 줄에는 테스트 케이스의 수 ( 0 < n < 50 )가 입력된다.

 두 번째 줄에서는 자신이 입력할 인풋 개수 ( 0 < m < 1000 ) 이다.

 이후 m 만큼의 이름과 점수가 입력된다.

 이름과 점수 사이는 공백으로 구분된다.


Output

 점수가 높은 사람 순으로 정렬하여 출력한다.

 각 케이스는 ‘Testcase#N’로 구분하게 된다. (여기에서 N은 정수)


입력 

출력 

 

2

김영수 999

박민지 1000

4

이상준 9

장대진 1

구미진 5

심형민 10

Testcase#0

박민지

김영수 

Testcase#1

심형민

이상준

구미진

장대진


 How to... 


이름과 점수를 하나의 구조체에 넣어 정렬과 출력을 쉽게 할 수 있었다.



  반성


- 처음에 쓸데없이 동적할당 받고, 링크드 리스트로 만들어 문제를 복잡하게 했다. 후 배열로 쉽게 해결...:(

- 문제에는 특별한 언급이 없었으나 이름 입력이 3글자 이상으로 들어오는 경우가 있었다. 그래서 처음에 이름을 받는 배열의 크기를 20으로만 잡아 Wrong answer가 떴다. 배열의 크기는 충분하게 잡는게 좋은 것 같다.


 소스 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef struct _Node
{
    char name[128];
    int idx;    
}Node;
 
Node arr[1110];
 
int main(void)
{
    int n, m;
    //char name[20];
 
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        m = 0;
 
        scanf("%d", &m);
                
        for (int j = 0; j < m; j++)
            scanf("%s %d", &arr[j].name, &arr[j].idx);
 
        for (int j = 0; j < m - 1; j++)
        {
            for (int k = 0; k < m - (j + 1); k++)
            {
                if (arr[k].idx < arr[k+1].idx)
                {
                    Node tmp;
                    tmp = arr[k];
                    arr[k] = arr[k+1];
                    arr[k+1] = tmp;
                }
            }
        }
        printf("Testcase#%d\n", i);
        for (int j = 0; j < m; j++)
            printf("%s\n", arr[j].name);
    }
    return 0;
}
 


'Algorithm > 기타' 카테고리의 다른 글

Tree - 난이도(하)  (0) 2014.04.07
[Programming Challenges] 3n+1 - 난이도(하)  (0) 2014.04.07
행렬의 곱 - 난이도(하)  (0) 2014.03.30
고과평가 - 난이도(하)  (0) 2014.03.30
[Programming Challenges]동맹 휴업(Hartals)  (0) 2014.03.24