문제 링크 : 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();
}
}
[결과]
'Algorithm' 카테고리의 다른 글
[Algorithm] 백준 1543번 : 문서 검색 (C++) (0) | 2023.07.05 |
---|---|
[Algorithm] 백준 1590번 : 캠프가는 영식 (C++) (0) | 2023.07.04 |
[Algorithm] 백준 18110번 : solved.ac (C++) (0) | 2023.07.02 |
[Algorithm] 백준 1431번 : 시리얼 번호 (C++) (0) | 2023.07.02 |
[Algorithm] 백준 1026번 : 보물 (C++) (0) | 2023.06.26 |