문제 - 점수 정렬 |
중간고사 후 시험 성적이 나왔다. 그러나 이름과 성적이 두서없이 섞여있다. 이를 점수가 높은 순으로 정렬한다.
Input
첫 번째 줄에는 테스트 케이스의 수 ( 0 < n < 50 )가 입력된다.
두 번째 줄에서는 자신이 입력할 인풋 개수 ( 0 < m < 1000 ) 이다.
이후 m 만큼의 이름과 점수가 입력된다.
이름과 점수 사이는 공백으로 구분된다.
Output
점수가 높은 사람 순으로 정렬하여 출력한다.
각 케이스는 ‘Testcase#N’로 구분하게 된다. (여기에서 N은 정수)
입력 |
출력 |
|
2
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 |