알고리즘/solved.ac CLASS 2

2108번: 통계학

melitina 2024. 6. 26. 01:06

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

 

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

int main() {
	// (1 ≤ N ≤ 500,000)
	// 단, N은 홀수이다. 
	int N;
	// 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
	double element;
	vector <double> v;
	// 산술평균
	double mean = 0;
	// 중앙값
	double median = 0;
	// 최빈값
	double mode = 0;
	// 범위
	double range = 0;

	// 첫째 줄에 수의 개수 N이 주어진다.
	cin >> N;

	for (int i = 0; i < N; i++) {
		//  다음 N개의 줄에는 정수들이 주어진다.
		cin >> element;

		v.push_back(element);
	}



	// 1. 산술평균 : N개의 수들의 합을 N으로 나눈 값
	for (int i = 0; i < N; i++) {
		mean += v[i];
	}

	// 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.
	mean = round(mean / N);

	// -0 출력 방지
	if (mean == -0) {
		mean = 0;
	}



	// 2. 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우
	// 그 중앙에 위치하는 값
	sort(v.begin(), v.end());

	if (N == 1) {
		median = v[0];
	}
	else {
		median = v[(N - 1) / 2];
	}



	// 3. 최빈값 : N개의 수들 중 가장 많이 나타나는 값
	int count[8001] = { 0, };
	for (int i = 0; i < N; i++) {
		// 4-1. 0 또는 양수일 경우
		if (v[i] >= 0) {
			count[int(v[i])]++;
		}
		// 4-2. 음수일 경우
		else {
			// fabs() 함수는 부동 소수점 인수 x의 절대값을 연산합니다.
			count[int(fabs(v[i])) + 4000]++;
		}
	}

	// 최빈값이 여러개일 경우
	int max = count[0];
	int index = 0;

	for (int i = 0; i < 8001; i++) {
		if (max < count[i]) {
			index = i;
			max = count[i];
		}
	}

	vector <double> mv;

	for (int i = 0; i < 8001; i++) {
		if (max == count[i]) {
			if (i <= 4000) {
				mv.push_back(i);
			}
			else {
				mv.push_back((i - 4000) * (-1));
			}
		}
	}

	// 정렬. 두번째로 작은 최빈값 출력
	sort(mv.begin(), mv.end());
	// 최빈값이 하나인 경우
	if (mv.size() == 1) {
		mode = mv[0];
	}
	// 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.
	else {
		mode = mv[1];
	}



	// 4. 범위 : N개의 수들 중 최댓값과 최솟값의 차이
	range = v[N - 1] - v[0];



	// 첫째 줄에는 산술평균을 출력한다.
	cout << mean << endl;
	// 둘째 줄에는 중앙값을 출력한다.
	cout << median << endl;
	// 셋째 줄에는 최빈값을 출력한다.
	cout << mode << endl;
	// 넷째 줄에는 범위를 출력한다.
	cout << range << endl;

	return 0;
}

 

https://beginnerdeveloper-lit.tistory.com/149

 

[C++] 백준 2108번 통계학

1. 문제이해 https://www.acmicpc.net/problem/2108 2108번: 통계학 첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은

beginnerdeveloper-lit.tistory.com

 

https://www.ibm.com/docs/ko/i/7.3?topic=functions-fabs-calculate-floating-point-absolute-value

 

fabs() — 부동 소수점 절대값 연산

형식 #include double fabs(double x); 설명 fabs() 함수는 부동 소수점 인수 x의 절대값을 연산합니다. 리턴값 fabs() 함수는 절대값을 리턴합니다. 오류 리턴값이 없습니다. 예 이 예는 x의 절대값으로 y를

www.ibm.com

 

'알고리즘 > solved.ac CLASS 2' 카테고리의 다른 글

18110번: solved.ac  (0) 2024.06.25
11651번: 좌표 정렬하기 2  (0) 2024.06.18
1676번: 팩토리얼 0의 개수  (0) 2024.06.16
28702번: FizzBuzz  (1) 2024.06.16
30802번: 웰컴 키트  (1) 2024.06.14