알고리즘 모음(C++)

백준 2108 - 통계학(C++) 본문

백준

백준 2108 - 통계학(C++)

공대생의 잡다한 사전 2022. 2. 21. 01:59

문제 링크입니다. https://www.acmicpc.net/problem/2108

 

2108번: 통계학

첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.

www.acmicpc.net

정렬을 사용한 문제입니다.

산술 평균값, 중앙값, 최빈값, 범위를 구하는 문제입니다.

중앙값, 범위의 경우에는 sort를 이용해 정렬을 한 뒤, 출력을 해주면 쉽게 할 수 있습니다.

 

산술 평균의 경우, 소수 첫번째 자리에서 반올림을 해야합니다. 따라서 캐스트 연산자를 사용해, 실수형 변수로 변환한 뒤, 출력해주면 됩니다.

 

최빈값의 경우는 조건이 있습니다.

1. 최빈 값이 여러개인 경우, 두번째로 작은 값을 출력한다.

2. 최빈 값이 하나인 경우, 해당 값만 출력한다.

여기서 주어지는 수의 범위는 -4000 ~ 4000입니다. 따라서 배열을 이용해 해당 수가 몇번 나왔는지를 확인할 건데, 배열 칸이 음수가 될 수 없으니, 음수에 해당하는 값은 4000 + (-N)의 값으로 저장을 해주고, 출력을 해주었습니다.

 

코드가 어렵진 않으니, 쉽게 이해할 수 있을겁니다.

 

자세한 것은 코드를 참고해주세요.

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <cstring>
#include <cmath>
#include <stack>
#include <map>

using namespace std;

int N;
int many_number[8001];
vector<int> number;

void solve(){
	long long int sum = 0;
	int many = 0;
	vector<int> num;
	sort(number.begin(), number.end());
	for(int i = 0; i < N; i++){
		sum += number[i];
	}
	for(int i = 0; i <= 8000; i++){
		if(many_number[i] > many){
			many = many_number[i];
		}
	}
	for(int i = 0; i <= 8000; i++){
		if(many_number[i] == many){
			int x = (i > 4000) ? -i + 4000 : i;
			num.push_back(x);		
		}
	}
	sort(num.begin(), num.end());
	if((double)sum / N > -0.5 && sum / (double)N <= 0.0) cout << "0\n";
	else printf("%.0f\n", (double)sum / N);
	cout << number[N/2] << "\n";
	if(num.size() == 1) cout << num[0] << "\n";
	else cout << num[1] << "\n";
	cout << number[N-1] - number[0];
}

int main() {
	cin.tie(0);
	cout.tie(0);
	cin >> N;
	for(int i = 0; i < N; i++){
		int x;
		scanf("%d", &x);
		if(x < 0) many_number[-x+4000]++;
		else many_number[x]++;
		number.push_back(x);
	}
	solve();
	return 0;
}

 

 

질문 및 조언 댓글 남겨주세요

'백준' 카테고리의 다른 글

백준 17069 - 파이프 옮기기 2(C+)  (0) 2022.02.22
백준 17070 - 파이프 옮기기 1(C++)  (0) 2022.02.21
백준 12851 - 숨바꼭질 2(C++)  (0) 2022.02.20
백준 10830 - 행렬 제곱(C++)  (0) 2022.02.20
백준 15666 - N과 M(12)(C++)  (0) 2022.02.20