[백준] 5800번 성적 통계 (C++)

유지연·2023년 3월 9일
0

PS

목록 보기
3/16

백준 5800번 성적 통계

문제

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


입력

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


출력

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

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


코드

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main() {
    ios::sync_with_stdio(0);
	cin.tie(0);
	int class_num;
	vector<int> v;

	cin >> class_num;

	for (int i = 0; i < class_num; i++) {
		int student_num;
		int largest_gap = 0;
		cin >> student_num;

		for (int j = 0; j < student_num; j++) {
			int score;
			cin >> score;
			v.push_back(score);
		}

		cout << "Class " << i + 1 << "\n";
		sort(v.begin(), v.end());

		for (int j = 0; j < student_num-1; j++) if (v[j + 1] - v[j] > largest_gap) largest_gap = v[j + 1] - v[j];
		
		cout << "Max " << v[student_num - 1] << ", " << "Min " << v[0] << ", " << "Largest gap " << largest_gap << "\n";
		
		v.clear();
	}
	return 0;
}

코드풀이

5800번은 vector를 사용하여 입력값을 저장하고 정렬만 해주면 끝나는 간단한 문제이다!
정렬은 sort 함수를 이용하였고, 문제에서 성적을 "내림차순"으로 정렬했을 때 가장 큰 인접한 점수 차이를 출력하라고 했지만 오름차순으로 정렬해도 결과값은 동일하기 때문에 오름차순으로 풀이하였다.

✔️cin

cin을 통해 입력을 받을 때에는 공백 or 개행문자를 기준으로 나누어 입력값을 저장하게 된다.

int a;
cin >> a;
cout << a;

입력: 1 2 3
출력: 1

위 코드의 경우에서 확인할 수 있듯, int형 변수 a에는 1까지 저장되고, 공백을 기준으로 뒤에 나오는 "2 3"은 저장되지 않는다. 이러한 cin의 특징을 이용하여 5800번에서 공백을 기준으로 나누어져 있는 정수들을 반복문을 통해 하나씩 vector의 요소로 추가할 수 있었다.

int a, b, c;
cin >> a >> b >> c;
cout << a << b << c;

입력: 1 2 3
출력: 1 2 3

입력값의 개수가 작은 경우는 반복문을 사용하지 않고, 위와 같은 형태로도 값을 저장할 수 있다. cin과 cout은 여러 값을 한 번에 다룰 수 있기 때문이다!


❗ 아무생각 없이 사용하던 cin과 cout 이었는데 조금 찾아보다보니, 디테일하게 공부해야겠다는 생각이 들어 별도로 c++의 입출력 시스템을 다루는 글을 써볼 계획이다. 공부는 끝이 없다아.

profile
Keep At It

0개의 댓글