백준 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 |
댓글()