https://www.acmicpc.net/problem/2108
백준 2108번 - 통계학(실버 3)

풀이
다른건 크게 어려울 것이 없는데 최빈값을 어떻게 처리할지 잘 생각해야 한다
unordered_map 에 <입력받은수, 등장횟수> 로 저장해서 최빈값을 찾는 식으로 구현했다.
그리고 밑에 조건에 평균에 -0 이 나오면 안된다고 되어 있다. 이 부분도 고려해서 출력해야 한다.
전체코드
#include <iostream>
#include <string>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <unordered_map>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<int> num(n,-4001);
vector<int> numcnt(n);
// 등장횟수
unordered_map<int, int> mapcnt;
int intsum = 0;
int intmin = 4000;
int intmax = -4000;
for (int i = 0; i < n; i++)
{
int k;
cin >> k;
// 숫자 저장
// 위의 인덱스별로 나온 개수 저장
mapcnt[k]++;
num[i] = k;
intsum+= num[i];
if (intmin > num[i])
{
intmin = num[i];
}
if (intmax < num[i])
{
intmax = num[i];
}
}
// n은 홀수
int midindex = (n +1) / 2;
vector<int> sortnum(n);
sortnum = num;
sort(sortnum.begin(), sortnum.end());
// 최빈값 구하기
// 카운트 중에 최대 구하기
vector<int> sortcnt(n);
sortcnt = numcnt;
sort(sortcnt.begin(), sortcnt.end(), greater<int>());
int maxcntidx = sortcnt[0];
// 최대 등장 횟수
int freqnum = 0;
// 최빈 값
int intmostfreq;
vector<int> freqno;
for (auto it:mapcnt)
{
// num , 등장횟수
if (freqnum < it.second)
{
freqnum = it.second;
}
}
for (auto it : mapcnt)
{
if (freqnum == it.second)
{
freqno.push_back(it.first);
}
}
if (freqno.size() > 1)
{
sort(freqno.begin(), freqno.end());
intmostfreq = freqno[1];
}
else
{
intmostfreq = freqno[0];
}
// 평균
if (round(static_cast<float>(intsum) / static_cast<float>(n)) == 0)
{
cout << 0 << "\n";
}
else
{
cout << round(static_cast<float>(intsum) / static_cast<float>(n)) << "\n";
}
// 중앙값
cout << sortnum[midindex-1] << "\n";
// 최빈값
cout << intmostfreq << "\n";
// 범위
cout << intmax - intmin;
}'백준 > 실버' 카테고리의 다른 글
| [백준 4659] - 비밀번호 발음하기(C++) (1) | 2025.08.19 |
|---|---|
| [백준 24446] - 알고리즘 수업 - 너비 우선 탐색 3 (C++) (0) | 2025.06.05 |
| 백준 [13022] - 늑대와 올바른 단어 (c++) (0) | 2025.03.17 |
| 백준[4134] - 다음 소수 (c++) (0) | 2025.01.24 |
| 백준 [1620]- 나는야 포켓몬 마스터 이다솜 (C++) (0) | 2025.01.09 |