https://www.acmicpc.net/problem/2108
2108번: 통계학
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
www.acmicpc.net
---------------------------------------------------핵심 알고리즘--------------------------------------------
정렬 + a
---------------------------------------------------풀이----------------------------------------------------
산술평균 : sum / N. 소수점 이하 첫째 자리에서 반올림한 값이므로, round()를 사용하였다.
그럼 마지막 예제에서 (-1)/3 = -0.3333이고, 이 값의 반올림 값으로 -0이 출력된다.
이 값을 0으로 만들기 위해, (int)로 타입캐스팅 해주었다.
중앙값 : sort()한 뒤 arr[N/2]의 값.
최빈값 : 값의 범위가 -4000~+4000이므로, 실제 값에 +4000을 한 값의 개수를 cnt[]에 저장한다.
예를 들어, -20이면 cnt[-20+4000]을 1 증가시키고, 40이면 cnt[40+4000]을 1 증가시킨다.
cnt[]를 arr[]+4000의 최솟값부터 최댓값까지 보면서 cnt[]의 값이 최대인 인덱스를 찾는다.
만약, 최대와 같은 값이 발견되면 그때의 인덱스 값이 최빈값이 된다.
최대와 같은 값의 세 번째 이상부터는 최빈값을 업데이트하지 않는다.
범위 : 최댓값-최솟값. 이미 sort()를 적용했으므로, arr[N-1]-arr[0]와 같다.
#define FASTIO ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <queue>
#include <cmath>
using namespace std;
int main(void){
FASTIO;
int N;
cin >> N;
// input
int arr[500'001] = {0, };
// 최빈값을 찾기 위해 각 숫자의 개수 세기(실제숫자+4000)
int cnt[10000] = {0, };
int total = 0;
for(int i = 0; i < N; i++){
cin >> arr[i];
total += arr[i];
cnt[arr[i]+4000]++;
}
// 산술평균
cout << (int)round((double)total/(double)N) << "\n";
// 중앙값
sort(arr, arr+N);
cout << arr[N/2] << "\n";
// 최빈값
int max_freq = 0; // cnt 최댓값
int max_freq_num = 0; // cnt가 최대인 수. 최빈값
int max_freq_cnt = 0; // cnt 최댓값의 개수
for(int i = arr[0]+4000; i <= arr[N-1]+4000; i++){
if(cnt[i] > max_freq){
max_freq = cnt[i];
max_freq_num = i-4000;
max_freq_cnt = 1;
}
else if(max_freq_cnt == 1 && cnt[i] == max_freq){
max_freq_num = i-4000;
max_freq_cnt++;
}
}
cout << max_freq_num << "\n";
// 범위
cout << arr[N-1]-arr[0] << "\n";
return 0;
}
---------------------------------------------------후기----------------------------------------------------
어려운 문제는 아닌데, average 출력 부분 조건이 조금 까다롭다고 생각해서 써두는 후기.
'알고리즘' 카테고리의 다른 글
[BOJ] 7568 덩치 (2) | 2023.05.26 |
---|---|
[BOJ] 4949 균형잡힌 세상 (0) | 2023.05.26 |
[BOJ] 1966 프린터 큐 (0) | 2023.05.25 |
[BOJ] 1929 소수 구하기 (2) | 2023.05.25 |
[BOJ] 10814 나이순 정렬 (0) | 2023.05.24 |