Priceless
[백준] 2108번: 통계학 (C++) 2트 본문
[백준] 2108번: 통계학 (C++) 1트 (tistory.com)
[백준] 2108번: 통계학 (C++) 1트
숫자를 입력 받아 산술 평균 중앙값 두 번째 최빈값 범위 4가지 통계 값을 구하는 문제이다 산술 평균은 반올림을 고려하여 진행하면 된다 중앙값 과 범위는 인덱스를 활용한다 최빈값은 기존에
priceless-hyun.tistory.com
최빈값 문제를 해결하기 못해 해결하지 못했던 문제
최빈값을 구하는 과정에서 새롭게 생각해야 할 부분이 있었다
새로운 해결법을 찾기 위해 찾아보던 중
다른 사이트에서는 최대 입력 값이 4000인 것을 고려하여 8000 크기를 가진 배열을 사용하였는데
그 부분이 이해가 가지 않아 다른 풀이를 찾던 중
아래의 사이트를 참고하였다
백준 2108 통계학 c++ [컴공과고씨] (tistory.com)
백준 2108 통계학 c++ [컴공과고씨]
https://www.acmicpc.net/problem/2108 2108번: 통계학 첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지
hagisilecoding.tistory.com
bool second 변수를 사용하여 첫 번째 최빈값과 두 번째 최빈값을 구분할 수 있었다
int ans 는 최빈값의 빈도를 나타내는 숫자로 가장 빈도가 높은 수가 나타나면 갱신된다
최빈값 문제를 해결하고 마지막 예제 입력 값을 넣고 실행했을 때
산술 평균에서 '-0'이 출력되는 문제가 나타났다
이 경우 출력값에 int나 unsigned 를 통한 타입 변경으로 문제를 해결하였다
// baekjoon 2107
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
// codes for fast I/O
void init(){
cin.tie(0);
cout.tie(0);
ios_base::sync_with_stdio(false);
}
int main(){
init();
int n;
cin >> n;
int arr[500001];
for(int i = 0; i < n; i++){
cin >> arr[i];
}
sort(arr, arr+n);
// 산술 평균
double mean1 = 0;
// 최빈값
int count = 0;
int ans = 0;
int temp = arr[0];
int mean3 = arr[0];
bool second = false;
for(int i = 0; i < n; i++){
// 산술 평균
mean1 += arr[i];
// 최빈값
if(temp == arr[i]){
count++;
}
else{
if(ans < count){
ans = count;
mean3 = arr[i - 1];
second = false;
}
else if (ans == count && !second){
mean3 = arr[i - 1];
second = true;
}
count = 1;
temp = arr[i];
}
if(ans < count){
mean3 = arr[n - 1];
}
else if (ans == count && !second){
mean3 = arr[n - 1];
}
}
cout << int(round(mean1 / n)) << '\n';
cout << arr[n/2] << '\n';
cout << mean3 << '\n';
cout << (arr[n-1] - arr[0]) << '\n';
}
이전에 시도했던 방법으로는 배열 두 개를 사용하거나
첫 번째와 두 번째 최빈값과 최빈값의 인덱스를 저장할 변수 4개를 사용하였다
어떻게든 해결할 수 있을 것 같았지만 잘 해결되지 않았다
bool 변수를 써서 쉽게 해결할 수 있다는 방법을 보고
세상에 똑똑한 사람이 많다는 것을 새삼 느낀다
공부도 더 열심히 해야겠다는 생각이다
'Algorithm & Test > 백준' 카테고리의 다른 글
[백준] 1427번: 소트인사이드 (C++) (0) | 2023.08.14 |
---|---|
[백준] 2503번: 숫자 야구 (C++) (0) | 2023.08.13 |
[백준] 1654번: 랜선 자르기 (C++) (0) | 2023.08.10 |
[백준] 2108번: 통계학 (C++) 1트 (0) | 2023.08.09 |
[백준] 2231번: 분해합 (C++) (0) | 2023.08.09 |