BEAKJOON

백준(2108번 통계학)풀이 C++

Shin_jisoo 2021. 1. 18. 00:23
728x90

www.acmicpc.net/problem/2108

 

2108번: 통계학

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

www.acmicpc.net

1) 주석 없는 VERSION

#include <iostream>
#include <cmath>
#include <stdio.h>
#include <utility>
#include <string>
#include <algorithm>
#include <vector>

using namespace std;


int main() {
	int n;
	cin >> n;

	int sum = 0;
	int tmp;
	int max = 0;
	int mode = 0;
	bool isSecond = false;

	vector<int> array(n);
	vector<int> count(8001, 0);

	for (int i = 0;i < n;i++) {
		cin >> array[i];
		tmp = (array[i] <= 0) ? abs(array[i]) : array[i] + 4000;
		sum += array[i];
		count[tmp] += 1;
		if (count[tmp] > max) {
			max = count[tmp];
		}
	}

	int middle = round(n / 2);
	
	sort(array.begin(), array.end());

	for (int i = -4000;i < 4001;i++) {
		tmp = i <= 0 ? abs(i) : i + 4000;
		if (count[tmp] == max) {
			mode = i;
			if (isSecond) break;
			isSecond = true;
		}
	}

	cout << round(sum / (double)n) << "\n";
	cout << array[middle] << "\n";
	cout << mode << "\n";
	cout << array[array.size() - 1] - array[0];

}

 

2) 주석 있는 VERSION

#include <iostream>
#include <cmath>
#include <stdio.h>
#include <utility>
#include <string>
#include <algorithm>
#include <vector>

using namespace std;


int main() {
	int n;
	cin >> n;

	int sum = 0; // n개의 수들의 합
	int tmp; // 음수는 0~4000 으로, 양수는 4001~8000 으로 지정해주기 위함
	int max = 0; // 최댓값
	int mode = 0; // 빈도수
	bool isSecond = false; // 최빈값이 여러개 있을 경우 최빈값 중 두 번째로 작은 수를 출력하기 위함

	vector<int> array(n);
	vector<int> count(8001, 0);

	for (int i = 0;i < n;i++) {
		cin >> array[i]; // n 개의 수 입력

		// 음수는 0~4000 으로 양수는 4001~8000 으로 빈도수 저장
		tmp = (array[i] <= 0) ? abs(array[i]) : array[i] + 4000;

		sum += array[i]; // n개의 수들의 합
		count[tmp] += 1; // 해당 숫자의 count 인덱스 +1

		// count 인덱스가 가장 많은 값인 최빈값 출력
		if (count[tmp] > max) {
			max = count[tmp];
		}
	}

	int middle = round(n / 2);
	
	sort(array.begin(), array.end());

	for (int i = -4000;i < 4001;i++) {
		tmp = i <= 0 ? abs(i) : i + 4000;
		
		// 만약 max 값이 또 나온다면
		if (count[tmp] == max) {

			// 최빈값을 해당 값으로 바꿔주기
			mode = i;
			if (isSecond) break;

			// true로 바꿔줘서 세번째 작은 값 부터는 해당이 안되게끔 바꿔줌
			isSecond = true;
		}
	}
	
	//산술평균
	cout << round(sum / (double)n) << "\n";
	//중앙값
	cout << array[middle] << "\n";
	//최빈값
	cout << mode << "\n";
	//범위
	cout << array[array.size() - 1] - array[0];

}