백준 2108 c++

magicdrill·2024년 3월 5일
0

백준 문제풀이

목록 보기
99/655

백준 2108 c++

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

int input(int lower, int upper);
int input_odd(int lower, int upper);
void input_numbers(vector <int>& vi, int size);
void sort_vector(vector <int>& vi);
void show_result(vector <int> vi);
int arithmetic_mean(vector <int> vi);
int median(vector <int> vi);
int mode(vector <int> vi);
int range(vector <int> vi);

int main(void)
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int N;
	vector <int> num_list;

	N = input_odd(1, 500000);
	input_numbers(num_list, N);
	sort_vector(num_list);
	show_result(num_list);

	return 0;
}

int input(int lower, int upper)
{
	//cout << "input()" << endl;
	int A;

	while (1)
	{
		cin >> A;
		if (A >= lower && A <= upper)
		{
			break;
		}
		else
		{
			;
		}
	}

	return A;
}

int input_odd(int lower, int upper)
{
	//cout << "input_odd()" << endl;
	int A;

	while (1)
	{
		cin >> A;
		if (A >= lower && A <= upper && A % 2 == 1)
		{
			break;
		}
		else
		{
			;
		}
	}

	return A;
}

void input_numbers(vector <int>& vi, int size)
{
	//cout << "input_numbers()" << endl;
	int i;

	for (i = 0; i < size; i++)
	{
		vi.push_back(input(-4000, 4000));
	}

	return;
}

void sort_vector(vector <int>& vi)
{
	//cout << "sort_vector()" << endl;
	sort(vi.begin(), vi.end());

	return;
}

void show_result(vector <int> vi)
{
	//cout << "show_result" << endl;
	//4000 * 500000해도 20억이기때문에 int로 계산한다.
	cout << arithmetic_mean(vi) << "\n";//산술평균
	cout << median(vi) << "\n";//중앙값
	cout << mode(vi) << "\n";//최빈값
	cout << range(vi) << "\n";//범위
}

int arithmetic_mean(vector <int> vi)
{
	double mean, total = 0;
	int i, result;
	int size = vi.size();

	for (i = 0; i < size; i++)
	{
		total = total + vi[i];
	}
	mean = total / size;
	//올림 : celi, 내림 : floor, 반올림 : round
	result = round(mean);

	return result;
}

int median(vector <int> vi)
{
	int size = vi.size();

	return vi[size / 2];
}

int mode(vector <int> vi)//최빈값이 여러개일 경우 최빈값 중 두 번째로 작은 값
{
	int size = vi.size();
	int i;
	int currentNum = vi[0];
	int count = 1;
	int maxCount = 1;
	int mode = currentNum;
	vector <int> temp;//최빈값이 여러개인 경우 모아둠

	temp.push_back(vi[0]);
	for (i = 1; i < size; i++)
	{
		if (vi[i] == currentNum)
		{
			count++;
		}
		else
		{
			currentNum = vi[i];
			count = 1;
		}
		
		if (count > maxCount) //최빈값을 초과하는 수가 나온 경우
		{
			temp.clear();
			maxCount = count;
			mode = currentNum;
			temp.push_back(mode);
		}
		else if (count == maxCount)//최빈값이 같은 경우
		{
			temp.push_back(currentNum);
		}
		else
		{
			;
		}
	}
	if (temp.size() != 1)
	{
		mode = temp[1];
	}
	else
	{
		;
	}

	return mode;
}

int range(vector <int> vi)
{
	return vi.back() - vi.front();
}

0개의 댓글