😈 알고리즘/💻 백준

💻 2108번 문제 : 통계학 ➕🤔

Buᐢ༝ᐢy 2022. 11. 24. 06:00
2108번: 통계학
https://www.acmicpc.net/problem/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)
4132761234

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