백준 Baekjoon

[C언어] 백준 2822 : 점수 계산

sujo 2020. 7. 21. 16:54

백준 2822 : 점수 계산

 

문제 링크

https://www.acmicpc.net/problem/2822

 

2822번: 점수 계산

문제 상근이는 퀴즈쇼의 PD이다. 이 퀴즈쇼의 참가자는 총 8개 문제를 푼다. 참가자는 각 문제를 풀고, 그 문제를 풀었을 때 얻는 점수는 문제를 풀기 시작한 시간부터 경과한 시간과 난이도로 결

www.acmicpc.net

 

 

문제 내용

(요약) 참가자는 총 8개의 문제를 푼다. 이 때, 참가자의 총 점수는 가장 높은 점수 5개의 합이다.

첫째 줄에는 참가자의 총점을 출력하고, 둘째 줄에는 어떤 문제가 최종 점수에 포함되었는지를 공백으로 구분하여 출력한다. 출력은 문제 번호가 증가하는 순서이어야 한다.

 

 

Idea

이 문제를 풀기위해서는 점수가 높은 5문제의 합과 문제 번호가 필요하다.

상위 문제와 문제 번호를 동시에 접근하기 위해 문제번호와 점수로 구성된 구조체를 만들었다.

 

문제를 푸는 아이디어는 다음과 같다.

  1. 점수를 기준으로 하여 내림차순으로 5개 까지 구한다.
  2. 구한 5개를 문제번호를 기준으로 하여 오름차순으로 정렬하고 출력한다.

*정렬방법은 선택정렬(Selection Sort)을 사용하였다.

 

 

Code

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
48
#include <stdio.h>
 
struct quiz {
    int n;
    int score;
};
 
int main() {
    struct quiz p[8];
    struct quiz tmp;
    int i, j, max, min, sum = 0;
    //인덱스와 score 삽입
    for (i = 0; i < 8; i++) {
        p[i].n = i + 1;
        scanf("%d"&p[i].score);
    }
    //최대 5개까지 정렬, score기준
    for (i = 0; i < 5; i++) {
        max = i;
        for (j = i+1; j < 8; j++) {
            if (p[max].score < p[j].score) max = j;
        }
        if (i != max) {
            tmp = p[i];
            p[i] = p[max];
            p[max] = tmp;
        }
    }
    //5개 정렬, n기준
    for (i = 0; i < 4; i++) {
        min = i;
        for (j = i + 1; j < 5; j++) {
            if (p[min].n > p[j].n) min = j;
        }
        if (i != min) {
            tmp = p[i];
            p[i] = p[min];
            p[min] = tmp;
        }
        //정렬된 부분 더해주기
        sum += p[i].score;
    }
    printf("%d\n", sum + p[4].score);
    for (i = 0; i < 5; i++)
        printf("%d ", p[i].n);
    printf("\n");
    return 0;
}
cs