😈 알고리즘/💻 백준
💻 2108번 문제 : 통계학 ➕🤔
Buᐢ༝ᐢy
2022. 11. 24. 06:00
2108번: 통계학


#include <iostream>
#include <vector>
#include <numeric>
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
vector<int> array(500000,0);
vector<int> maxCount(8001,0);
int N = 0;
cin >> N;
int sum = 0;
for(int i = 0; i < N; i++)
{
int input = 0;
cin >> input;
array[i] = input;
sum += input;
maxCount[array[i]+4000]++;
}
array.resize(N);
int divide = round(double(sum)/N);
cout << divide << '\n';
sort(array.begin(), array.end());
cout << array[N/2] << '\n';
int maxCountIndex = 0;
int maxCountValue = 0;
for(int i = 0; i < 8001; i++)
{
if(maxCount[i] > maxCountValue)
{
maxCountValue = maxCount[i];
maxCountIndex = i;
}
}
for(int i = maxCountIndex + 1; i < 8001; i++)
{
if(maxCount[i] == maxCountValue)
{
maxCountIndex = i;
break;
}
}
cout << maxCountIndex - 4000 << '\n';
int min = array.front();
int max = array.back();
int differance = max - min;
cout << differance <<'\n';
}
메모리 (KB) | 시간 (ms) | 코드 길이 (B) |
4132 | 76 | 1234 |
2일 정도 걸렸던 문제였다. vector
로 풀어봤는데 여러 가지 함수들을 이용해서 값을 도출해야 하는 문제였다. 이전까지 몇 가지는 직접 함수나 식을 만들어서 원하는 값이 나오도록 해주었지만, 이번에는 최대한 문제의 의도대로 하고 싶어서 검색해가며 다양한 함수를 쓰려고 노력했다.
하지만 아직까지도 최빈값은 완벽히 이해하지 못한 거 같다. 소가 뒷걸음치다 쥐 잡은 격으로 정말 우연히 맞은 문제라 다시 풀어 봐야겠다.
#include <iostream>
#include <vector>
#include <numeric>
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
vector<int> array(500000,0); // 최대 요소의 개수 수용 가능한 벡터
vector<int> maxCount(8001,0); // -4000 ~ 4000 수용 가능한 벡터
int N = 0;
cin >> N;
int sum = 0;
for(int i = 0; i < N; i++)
{
int input = 0;
cin >> input;
array[i] = input;
sum += input; // array에 들은 값을 다 더해줌
maxCount[array[i]+4000]++; // 음수를 고려해서 4000을 더해줌
}
array.resize(N); // 계산해줘야 하는 범위까지 사이즈를 다시 잡아줌
int divide = round(double(sum)/N); // cmath, 자동 반올림까지
cout << divide << '\n'; // 산술 평균 출력
sort(array.begin(), array.end()); // 오름차순으로 정렬
cout << array[N/2] << '\n'; // 중앙값 출력
int maxCountIndex = 0;
int maxCountValue = 0;
for(int i = 0; i < 8001; i++)
{
if(maxCount[i] > maxCountValue)
{
maxCountValue = maxCount[i];
maxCountIndex = i;
}
}
for(int i = maxCountIndex + 1; i < 8001; i++)
{
if(maxCount[i] == maxCountValue) // 최빈값이 같을 때 대비
{
maxCountIndex = i;
break;
}
}
cout << maxCountIndex - 4000 << '\n'; // 최빈값 출력
// 이미 정렬한 상태기 때문에 인덱스 첫번째와 마지막 값을 변수에 저장
int min = array.front();
int max = array.back();
int differance = max - min;
cout << differance <<'\n'; // 범위 출력
}
이번에는 주석을 넣어 어떤 구간에서 어떤 값을 꺼내고 싶었는지 구분해주었다.
➕ 재풀이
#include <iostream>
#include <vector>
#include <numeric>
#include <algorithm>
using namespace std;
int main()
{
vector<int> array(500000, 0);
int N = 0;
cin >> N;
for(int i = 0; i< N; i++)
{
int input = 0;
cin >> input;
array.push_back(input);
}
array.resize(N);
reverse(array.begin(), array.end());
int sum = accumulate(array.begin(), array.end(), 0, plus<int>());
int average = sum / N;
if(sum % N >=5 ) average++;
cout << average << '\n';
sort(array.begin(), array.end());
cout << array[N/2] << '\n';
// 최빈값
vector<int> countArr(8001, 0);
vector<int> countSaveArr;
int count = 0;
for(int i = 0; i<N;i++)
{
countArr[array[i]+4000];
}
for(int i = 0; i < 8001; i++)
{
if(countArr[i] <= count)
{
count = countArr[i];
}
}
for(int i = 0; i < 8001; i++)
{
if(countArr[i]==count)
{
countSaveArr.push_back(i);
}
}
if(countSaveArr.size()<=1)
cout << countSaveArr[0] << '\n';
else{
cout << countSaveArr[1] << '\n';
}
int min = array[0];
int max = array[N-1];
cout << max - min << '\n';
}
🤔 다시 풀어보기
지금보다 벡터에 더 익숙해질 때 다시 풀어볼 것이다. 아직 헷갈리는 점은 배열과 달리 벡터는 동적으로 사용할 수 있기 때문에 최대 범위까지 만들어줄 필요 없이 요소를 계속 넣어주는 게 더 좋은건지, 풀었던 방법처럼 resize를 해주어도 속도가 빠른지 모르겠다. 또, 지금보다 더 쉽게 최빈값을 도출하는 코드도 짜보고 싶다.
Uploaded by N2T