백준 2108에 해당하는 글 1

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

CodingTest/백준|2022. 5. 31. 15:48

제출 현황

Round 함수에 대한 Math 헤더를 추가 안하였다...ㅠ

 

 

문제를 읽고 단순 구현문제라고 판단하여 바로 구현을 시작하였다.

 

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	cin >> iNum;
	vMap.resize(iNum);
	for (int i = 0; i < iNum; i++)
		cin >> vMap[i];
	sort(vMap.begin(), vMap.end());
	cout << Sum() << "\n";
	cout << vMap[iNum / 2] << "\n";
	cout << Mode() << "\n";
	cout << vMap.back() - vMap.front() << "\n";
}

 

Main에 입력과 출력문으로만 구성을 하였고

 

int Sum()
{
	long long int iSum = 0;
	for (int i = 0; i < iNum; i++)
		iSum += vMap[i];
	return (int)round((float)iSum / (float)iNum);
}

 

1번 더하기는 각수를 더한 후 round처리로 반올림 처리를 하였다.

round() : 반올림

ceil() : 무조건 올림

floor() : 무조건 내림

Math.h 헤더 선언 필요... (Visual 2022에서 선언없이 실행이 되어 실행 되는줄...)

 

int Mode()
{
	if (iNum == 1)
		return vMap[0];
	vector<pair<int, int>> vMode;
	vMode.resize(iNum);
	int iCnt = 0;
	while (iCnt < iNum)
	{
		int iTemp = upper_bound(vMap.begin(), vMap.end(), vMap[iCnt])
					- lower_bound(vMap.begin(), vMap.end(), vMap[iCnt]);
		vMode[iCnt] = make_pair(iTemp, vMap[iCnt]);
		iCnt += iTemp;
	}
	sort(vMode.begin(), vMode.end(), cmp);
	int iModeVal = vMode[0].first;
	vector<int> vResultMode;
	vResultMode.reserve(iNum);
	for (int i = 0; i < iNum; i++)
	{
		if(vMode[i].first == iModeVal)
			vResultMode.emplace_back(vMode[i].second);
	}
	if (vResultMode.size() > 1)
		return vResultMode[1];
	else
		return vResultMode.front();
}

 

최빈값을 이렇게 처리하였지만 고수분들은 더 깔끔하게 하였을것 같다... 너무 더럽다...

먼저 pair<int, int>로 upper_bound와 lower_bound를 사용하여 중첩된 수를 체크 후

최고 개수로 다시 vector를 구성하여

개수가 2개 이상 → 2번째 인자 출력

개수가 1개 → 첫번째 인자 출력

 

pair에 대한 정렬은 cmp를 정의하여 pair에 대한 비교를 수행하였다.

bool cmp(pair<int, int> pFront, pair<int, int> pBack)
{
	if (pFront.first == pBack.first)
		return pFront.second < pBack.second;
	return pFront.first > pBack.first;
}

 

pair는 (중첩 개수, 해당 인자 값) 으로 구성하였고

중첩 수가 같다면 인자의 값으로 정렬을 하였다.

 

아래는 모든 코드입니다.

#include <iostream>
#include <vector>
#include <algorithm>
#include <math.h>
using namespace std;

int iNum = 0;
vector<int> vMap;

int Sum()
{
	long long int iSum = 0;
	for (int i = 0; i < iNum; i++)
		iSum += vMap[i];
	return (int)round((float)iSum / (float)iNum);
}

bool cmp(pair<int, int> pFront, pair<int, int> pBack)
{
	if (pFront.first == pBack.first)
		return pFront.second < pBack.second;
	return pFront.first > pBack.first;
}

int Mode()
{
	if (iNum == 1)
		return vMap[0];
	vector<pair<int, int>> vMode;
	vMode.resize(iNum);
	int iCnt = 0;
	while (iCnt < iNum)
	{
		int iTemp = upper_bound(vMap.begin(), vMap.end(), vMap[iCnt])
					- lower_bound(vMap.begin(), vMap.end(), vMap[iCnt]);
		vMode[iCnt] = make_pair(iTemp, vMap[iCnt]);
		iCnt += iTemp;
	}
	sort(vMode.begin(), vMode.end(), cmp);
	int iModeVal = vMode[0].first;
	vector<int> vResultMode;
	vResultMode.reserve(iNum);
	for (int i = 0; i < iNum; i++)
	{
		if(vMode[i].first == iModeVal)
			vResultMode.emplace_back(vMode[i].second);
	}
	if (vResultMode.size() > 1)
		return vResultMode[1];
	else
		return vResultMode.front();
}

int main()
{
	cin >> iNum;
	vMap.resize(iNum);
	for (int i = 0; i < iNum; i++)
		cin >> vMap[i];
	sort(vMap.begin(), vMap.end());
	cout << Sum() << "\n";
	cout << vMap[iNum / 2] << "\n";
	cout << Mode() << "\n";
	cout << vMap.back() - vMap.front() << "\n";
}

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

백준 1774 - 듣보잡(C++)  (0) 2022.06.02
백준 18870 - 좌표 압축(C++)  (0) 2022.06.02
백준 17219 - 비밀번호 찾기(C++)  (0) 2022.06.02
백준 18111 - 마인크래프트(C++)  (0) 2022.06.02
백준 2805 - 나무 자르기(C++)  (0) 2022.05.31

댓글()