728x90
반응형

문제 링크 : https://www.acmicpc.net/problem/5800

 

5800번: 성적 통계

첫째 줄에 중덕 고등학교에 있는 반의 수 K (1 ≤ K ≤ 100)가 주어진다. 다음 K개 줄에는 각 반의 학생수 N (2 ≤ N ≤ 50)과 각 학생의 수학 성적이 주어진다. 시험 성적은 0보다 크거나 같고, 100보다

www.acmicpc.net


[문제]

한상덕은 이번에 중덕 고등학교에 새로 부임한 교장 선생님이다. 교장 선생님으로서 첫 번째 일은 각 반의 수학 시험 성적의 통계를 내는 일이다.중덕 고등학교 각 반의 학생들의 수학 시험 성적이 주어졌을 때, 최대 점수, 최소 점수, 점수 차이를 구하는 프로그램을 작성하시오.

[입력]

첫째 줄에 중덕 고등학교에 있는 반의 수 K (1 ≤ K ≤ 100)가 주어진다. 다음 K개 줄에는 각 반의 학생수 N (2 ≤ N ≤ 50)과 각 학생의 수학 성적이 주어진다. 시험 성적은 0보다 크거나 같고, 100보다 작거나 같은 정수이고, 공백으로 나누어져 있다. 

[출력]

각 반에 대한 출력은 다음과 같이 두 줄로 이루어져 있다.

  • 첫째 줄에는 "Class X"를 출력한다. X는 반의 번호이며 입력으로 주어진 순서대로 1부터 증가한다.
  • 둘째 줄에는 가장 높은 점수, 낮은 점수, 성적을 내림차순으로 정렬했을 때 가장 큰 인접한 점수 차이를 예제 출력과 같은 형식으로 출력한다.

[알고리즘 분류]

  • 정렬
  • 구현

[해설]

이 문제는 간단하게 algorithm 헤더의 sort(정렬)을 이용해 해결할 수 있다.

각 학생들의 점수는 정렬(오름차순)을 수행한 후 첫 번째 값은 최소값, 마지막 값(N-1 인덱스)에 존재하는 값을 최대값으로 출력한다.

인접한 점수들의 최대 점수차이는 각 점수끼리 뺄셈을 한 값에 절대값(abs) 메서드로 단순 차이값을 구하고 이를 g배열에 저장, 그리고 정렬을 수행한 뒤 마지막 값을 가져오거나, 정렬을 이용하지 않는다면 반복문을 사용해 각 값을 비교해 최댓값을 구한 뒤 이를 출력하는 방법이 있다.

[정답 코드]

#include<bits/stdc++.h>
using namespace std;
int K,N;
int main(){
    cin >> K;
    for(int k=1;k<=K;k++) {
        cin >> N;
        vector<int>s(N); vector<int>g;
        for(int i=0;i<N;i++) cin >> s[i];
        sort(s.begin(),s.end());
        for(int i=0;i<N-1;i++) g.push_back(abs(s[i]-s[i+1]));
        sort(g.begin(),g.end());
        cout << "Class " << k << "\n" << "Max " << s[N-1] << ", Min " << s[0] << ", Largest gap " << g[g.size()-1] << '\n';
        g.clear(); s.clear();
    }
}

[결과]

728x90
반응형

+ Recent posts