BOJ 2108 C++ 통계학
백준 2108 cpp 통계학
아이디어
산술평균 : sum / N
중앙값: sort하고 N/2 번째 인덱스에 위치하는 값
범위: 최대값 - 최소값
최빈값:
-
음수배열과 양수배열을 따로 선언
-
음수배열과 양수배열에 전체 array의 값에 해당하는 인덱스를 저장.
-
음수배열 양수배열 모두 돌면서 가장 큰 값을 가진 녀석의 값을 저장해둠(mostFrequentValue라고 하자.)
-
다시 한 번 쭉 돌면서 mostFrequentValue와 같은 요소를 만나면
4.1 음수배열인 경우 isMinus = true로 두고 해당 인덱스를 tempAnswer에 저장. isSecond에 1을 더함. isSecond가 1인데 또 mostFrequentValue를 만나면 해당 인덱스를 바로 리턴하면 됨.
4.2 양수배열인 경우 isMinus = false로 두고 해당 인덱스를 tempAnswer에 저장. isSecond에 1을 더함. isSecond가 1인데 또 mostFrequentValue를 만나면 해당 인덱스를 바로 리턴하면 됨.
-
4번에서 return 되지 않은 경우 최빈값은 하나라는 뜻이므로 isMinus가 true이면 -tempAnswer를 리턴, false이면 tempAnswer를 리턴.
#include <bits/stdc++.h>
using namespace std;
int average, center, frequent, range = 0;
int arr[500001];
int N;
int frequencyPlus[4001];
int frequencyMinus[4001];
int getCenter()
{
sort(arr, arr + N);
return (arr[(N / 2)]);
}
int getFrequent()
{
// 음수배열과 양수배열을 따로 만들어 나온 값들을 저장.
for (int i = 0; i < N; i++)
{
if (arr[i] < 0)
frequencyMinus[-arr[i]]++;
else
frequencyPlus[arr[i]]++;
}
int mostFrequentValue = 0;
// 음수배열 양수배열 모두 돌면서 가장 큰 값을 저장해둠(최빈값).
for (int i = 0; i < 4001; i++)
{
mostFrequentValue = max(mostFrequentValue, frequencyMinus[i]);
}
for (int i = 0; i < 4001; i++)
{
mostFrequentValue = max(mostFrequentValue, frequencyPlus[i]);
}
bool isMinus;
int temporaryAnswerIndex;
int isSecond = 0;
for (int i = 4001; i > 0; i--)
{
if (frequencyMinus[i] == mostFrequentValue)
{
if (isSecond == 1)
{
return (-i);
}
isMinus = true;
temporaryAnswerIndex = i;
isSecond += 1;
}
}
for (int i = 0; i < 4001; i++)
{
if (frequencyPlus[i] == mostFrequentValue)
{
if (isSecond == 1)
return i;
isMinus = false;
temporaryAnswerIndex = i;
isSecond += 1;
}
}
if (isMinus)
return (-temporaryAnswerIndex);
else
return (temporaryAnswerIndex);
}
int getRange()
{
int minimumVal = 2147483647;
int maximumVal = -2147483648;
for (int i = 0; i < N; i++)
{
minimumVal = min(minimumVal, arr[i]);
maximumVal = max(maximumVal, arr[i]);
}
return (int)(maximumVal - minimumVal);
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N;
for (int i = 0; i < N; i++)
{
cin >> arr[i];
}
double sum = 0;
for (int i = 0; i < N; i++)
{
sum += arr[i];
}
average = round(sum / N);
frequent = getFrequent();
range = getRange();
center = getCenter();
cout << average << '\n' << center << '\n' << frequent << '\n' << range << '\n';
}
'Algorithm' 카테고리의 다른 글
BOJ 2292 cpp 벌집 (0) | 2020.11.17 |
---|---|
BOJ 2231 c++ 분해합 (4) | 2020.11.16 |
BOJ 1966 c++ 프린터 큐 (0) | 2020.11.13 |
BOJ 1929 소수 구하기 C++ (0) | 2020.11.12 |
BOJ 1018 체스판 다시 칠하기 c++ (0) | 2020.11.09 |
최근댓글