평균을 구하는데, 반올림시 5 이상(>=) 조건을 주지않아 틀렸었다.
- round 함수 통해 쉽게 할수도 있었다.
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
int main(){
int n, input, a2, a3, a4;
vector<int> v;
int sum = 0;
int min = 4000;
int max = -4000;
int arr[8001] = { 0, };
// 음수를 배열에 넣을수 없기때문에, 크기를 음수포함할수 있도록 늘려줌
scanf("%d", &n);
for (int i = 0; i < n; i++){
scanf("%d", &input);
sum += input;
v.push_back(input);
if (input < min) min = input;
if (input > max) max = input;
if (input < 0) arr[input + 8001]++;
// 음수일 경우 +8001 하여 저장
// 최빈값 구하기 위해 카운팅 배열 사용
else arr[input]++;
}
// 1번산술평균 구하기
// cmath의 round 함수로 쉽게 가능하다.
// double로 구해야함
int a1;
double tmp = (double)sum / n;
// *산술평균이 음수일때와 양수일때를 나눠야한다
// ex ) -1.7 => -2 (내림) 1.7 => 2 (올림)
if (tmp > 0){
if ((int)(tmp * 10) % 10 >= 5) a1 = ceil(tmp);
// 소수 첫째자리를 구하여 5 이상일 경우 ceil 함수통해 반올림
else a1 = floor(tmp);
// 5 미만일 경우 내린다.
}
else {
// 음수일 경우
if ((int)(tmp * -10) % 10 >= 5) a1 = floor(tmp);
else a1 = ceil(tmp);
}
// 2번 중앙값 구하기
// algorithm의 sort를 사용하여 간단히 구함 (홀수기 때문에 n/2가 무조건 중앙값 index (벡터는 0부터 index 시작하기 때문) )
int medianindex = n / 2;
sort(v.begin(), v.end());
a2 = v[medianindex];
// 3번 최빈값 구하는 과정
int cnt = 0;
int idx;
int flag = 0;
// 음수 부터 scan 시작하여, 최빈값을 구한다.
// 음수 -> 양수순으로 해서 같은 빈도로 나올때 flag를 설정하여 두번째로 작은값을 뽑는다.
// 더 많은 빈도수가 나오는 값이 생기면 flag 초기화
for (int i = 4001; i <= 8000; i++){
if (arr[i] > cnt){
cnt = arr[i];
idx = i;
flag = 1;
}
else if (arr[i] == cnt){
if (flag == 1){
idx = i;
}
flag++;
}
}
for (int i = 0; i <= 4000; i++){
if (arr[i] > cnt){
cnt = arr[i];
idx = i;
flag = 1;
}
else if (arr[i] == cnt){
if (flag == 1){
idx = i;
}
flag++;
}
}
a3 = idx > 4000 ? idx - 8001 : idx;
// 최빈값 구하는 과정 끝
// 4번 ragne 구하기
a4 = max - min;
// 정답 출력
cout << a1 << "\n";
cout << a2 << "\n";
cout << a3 << "\n";
cout << a4 << "\n";
return 0;
}
'알고리즘 > 백준 문제풀이' 카테고리의 다른 글
[백준 문제풀이 / C++] 2565 전깃줄 (0) | 2020.08.20 |
---|---|
[백준 문제풀이 / C++] 2981 검문 (0) | 2020.08.15 |