[C++ 백준] 2108 통계학
728x90
반응형
블로그에 올리는 모든 문제 풀이는 깃허브에 올려져 있습니다.
문제 설명
- 다음 4가지의 기본 통계 값을 구하는 프로그램을 작성하시오. 단, N(1 <=N <=500,000)은 홀수라고 가정한다.
- 산술평균 : N개의 수들의 합을 N으로 나눈 값 (소수점 이하 첫째 자리에서 반올림한 값을 출력)
- 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
- 최빈값 : N개의 수들 중 가장 많이 나타나는 값 (여러 개 존재 시 두 번째로 작은 값 출력)
- 범위 : N개의 수들 중 최댓값과 최솟값의 차이
- 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
풀이 전략
- 평균: 다 더해서 개수만큼 나눈다.
- 중앙값: 정렬해서 중앙 인덱스를 출력한다.
- 범위: 정렬한 벡터의 맨 끝 인덱스 - 맨 앞 인덱스 값
- 최빈값: 두 가지 풀이로 접근해 보았다.
1. 배열에 해당 값이 몇 번 나타났는지 + 최빈값이 뭔지 미리 구해놓고 계산
2. 벡터를 돌면서 최빈값 계산
메모리와 시간은 2안이 빠르지만 가독성은 1안이 더 좋다.
소스 코드
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
int arr[8001];
using namespace std;
int main()
{
int x;
cin >> x;
int sum = 0;
int index = 0;
int max = 0;
vector<int> list;
for (int i = 0; i < x; i++)
{
int num;
cin >> num;
sum += num;
if (num <= 0)
index = -num;
else
index = 4000 + num;
arr[index]++;
if (arr[index] > max)
max = arr[index];
list.push_back(num);
}
// 평균, 소수점 이하 첫째 자리 반올림
float avg = sum / (float)x;
cout << round(avg) << '\n';
// 중앙값
sort(list.begin(), list.end());
cout << list[list.size()/2] << '\n';
// 최빈값
//#1
bool flag = false;
int result = 0;
for (int i = -4000; i < 4001; i++)
{
if (i <= 0)
index = -i;
else
index = 4000 + i;
if (arr[index] == max)
{
result = i;
if (flag)
break;
flag = true;
}
}
//#2
//int curNum = 8000;
//int curCount = 1;
//int result = 0;
//int minCount = 0;
//int sameCount = 0;
//for (int i = 0; i < list.size(); i++)
//{
// if (list[i] != curNum)
// {
// curNum = list[i];
// curCount = 1;
// }
// else if (list[i] == curNum)
// {
// curCount++;
// }
// if (curCount > minCount)
// {
// minCount = curCount;
// result = list[i];
// sameCount = 0;
// }
// else if (curCount == minCount && sameCount < 1)
// {
// sameCount++;
// result = list[i];
// }
//}
cout << result << '\n';
// 범위
cout << list[list.size() - 1] - list[0];
}
링크
https://www.acmicpc.net/problem/2108
728x90
반응형
'문제풀이 > BOJ' 카테고리의 다른 글
[C++ 백준] 1932 정수 삼각형 (0) | 2021.11.22 |
---|---|
[C++ 백준] 15650 N과 M (2) (0) | 2021.10.30 |
[C++ 백준] 1181 단어 정렬 (0) | 2021.08.26 |
[C++ 백준] 18870 좌표 압축 (0) | 2021.08.18 |
[C++ 백준] 11651 좌표 정렬하기2 (0) | 2021.06.14 |
댓글
이 글 공유하기
다른 글
-
[C++ 백준] 1932 정수 삼각형
[C++ 백준] 1932 정수 삼각형
2021.11.22 -
[C++ 백준] 15650 N과 M (2)
[C++ 백준] 15650 N과 M (2)
2021.10.30 -
[C++ 백준] 1181 단어 정렬
[C++ 백준] 1181 단어 정렬
2021.08.26 -
[C++ 백준] 18870 좌표 압축
[C++ 백준] 18870 좌표 압축
2021.08.18