본문 바로가기

백준/C++

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

728x90

 

 

오늘은 어려워 보였던 문제를 풀려고 한다.

 

 

문제

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

 

5800번: 성적 통계

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

www.acmicpc.net

 

 

응??? 그런데... 읽어보니까 생각보다 간단한 문제였다. 반의 수만큼 for문을 돌려주는데 여기서 "Class 반의 번호"를 출력해줘야 하므로 1부터 시작하고, 그 안에서는 배열에 학생수만큼 입력받고 내림차순을 해주면 되겠다. 가장 큰 인접한 점수 차이를 알아내기 위해서는 인덱스를 0부터 n-1 되기 전까지 넣어주어 비교하면 될 것 같다.

 

 

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

int k, n;

int main() {
	cin >> k;
	for(int j = 1; j <= k; j++){
		int p[50];
		//입력받기
		cin >> n;
		for (int i = 0; i < n; i++) {
			cin>> p[i];
		}
		// 내림차순
		sort(p, p + n, greater<int>());
		int gap = 0;
		//가장 큰 인접한 점수 차이
		for (int i = 0; i < n-1; i++) {
			if (gap < p[i] - p[i + 1]) {
				gap = p[i] - p[i + 1];
			}
		}
		// 출력
		cout << "Class " << j << "\n" << "Max " << p[0] 
			<< ", Min " << p[n - 1] << ", Largest gap " << gap << "\n";
	}

	return 0;
}

 

 

 

 

 

 

 

 

 

 

음음

이 분은 벡터를 사용하셨다. 그리고 전체적인 흐름은 비슷했다.

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

int K, N;
int x;
int main(int argc, char **argv){
  scanf("%d",&K);

  for(int i=0; i<K; i++){
    int gap = -1; // 오름차순이므로 이전수 - 현재수 < 0 일 수 없다.
    vector<int> v;
    
    scanf("%d",&N);
    
    for(int j=0; j<N; j++){
      scanf("%d", &x);
      v.push_back(x);
    }
    sort(v.begin(),v.end(), greater<>()); // 내림차순 정렬

    for(int j=0; j<N-1; j++){
      if(gap < v[j] - v[j+1]){
        gap = v[j] - v[j+1];
      }
    }

    printf("Class %d\n", i + 1);
    printf("Max %d, Min %d, Largest gap %d\n", v[0], v[N-1], gap);
  }

  return 0;
}
출처: https://velog.io/@lamknh/C-%EB%B0%B1%EC%A4%80-5800-%EC%84%B1%EC%A0%81-%ED%86%B5%EA%B3%84

 

 

 

 

그리고 찾아보다보니 동적 배열을 사용해서 delete []로 초기화하신 분을 보았다. 그래서 delete와의 차이가 궁금해서 찾아보았다. 만약 int형 메모리 공간 5개가 필요한 배열 Array가 있다고 해보자. delete Array;를 한다면 그 배열의 첫 주소 딱 하나만 해제하게 될 것이고, delete [] Array;를 하면 int형 메모리 공간 5개를 처음부터 끝까지 해제하게 될 것이라고 한다.

 

 

이왕 찾아본 김에...

vector 배열을 비울 수 있는 함수는 Array.clear(),

배열은 fill_n(Array, 배열 크기, 채울 값);을 사용하면 된다.

 

 

[참고] https://gerrk.tistory.com/23,

https://yebeen-study-note.tistory.com/38

 

 

 

728x90

'백준 > C++' 카테고리의 다른 글

[C++] 백준 2470번 - 두 용액  (2) 2024.03.01
[C++] 백준 2822번 점수 계산  (6) 2023.12.27
[C++] 백준 14729번 칠무해  (2) 2023.12.25
[C++] 백준 5576번 콘테스트  (2) 2023.12.25
[C++] 백준 2752번 세수정렬  (2) 2023.12.23