백준문제풀이

백준 문제 24509번 상품의 주인은? 문제풀이 c++

노가다 김씨 2022. 3. 6. 21:45

https://www.acmicpc.net/problem/24509

 

24509번: 상품의 주인은?

혜민이네 반은 총 $N$명의 학생으로 이루어져 있으며 학생마다 번호가 다르게 배정되어 있다. 이번 시험은 국어, 영어, 수학, 과학 총 4과목으로 진행되며, 학생들이 공부를 열심히 할 수 있게 과

www.acmicpc.net

 

문제 해석

 

문제를 읽고 정렬하면 될거같았다.

과목이 4개이므로 벡터 4개를 만들고 점수는 0점부터 100점이 존재하니까 1개 벡터당 0~100 101개의 벡터를 만들어주었다.

중복된 학생이 상을 타면안되므로 방문 배열을 만들어서 상을 이미 이전에 받은적이 있다면 상을 주지않게하였다.

A B C D는 순서대로 국영수과이다.

 

예를들어 28번 학생이 국어 84점을 받았다면 A[84]에 28번을 넣어준다.

이 행위가 전부 끝나면 A B C D를 각각 정렬해주고 A[100]에서 A[0]까지 상을 한명 줄때까지 반복후 종료

그 뒤 B[100]에서 B[0]까지 ... 그 뒤 C[100]에서 C[0]까지 .... 그뒤 D[100]에서 D[0]까지 그럼 끝.

 

코드

 

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void print_A();
void print_B();
void print_C();
void print_D();
bool visited[200001];
vector <int> A[101];
vector <int> B[101];
vector <int> C[101];
vector <int> D[101];
int main(){
    cout.tie(NULL);
    cin.tie(NULL);
    ios_base::sync_with_stdio(false);
    int N,X,inputA,inputB,inputC,inputD;;
    cin>>N;
    for(int i=0; i<N; i++)
    {
        cin>>X>>inputA>>inputB>>inputC>>inputD;
        A[inputA].push_back(X);
        B[inputB].push_back(X);
        C[inputC].push_back(X);
        D[inputD].push_back(X);
    }
    for(int i=0; i<101; i++)
    {
        sort(A[i].begin(),A[i].end());
        sort(B[i].begin(),B[i].end());
        sort(C[i].begin(),C[i].end());
        sort(D[i].begin(),D[i].end());
    }
    print_A();
    print_B();
    print_C();
    print_D();
}
void print_A(){
    for(int i=100; i>=0; i--)
    {
        for(int j=0; j<A[i].size(); j++)
        {
            cout<<A[i][j]<<" ";
            visited[A[i][j]]=1;
            return;
        }
    }
}
void print_B(){
    for(int i=100; i>=0; i--)
    {
        for(int j=0; j<B[i].size(); j++)
        {
            if(visited[B[i][j]]==1)
            {
                continue;
            }
            else
            {
                cout<<B[i][j]<<" ";
                visited[B[i][j]]=1;
                return;
            }
        }
    }
}
void print_C(){
    for(int i=100; i>=0; i--)
    {
        for(int j=0; j<C[i].size(); j++)
        {
            if(visited[C[i][j]]==1)
            {
                continue;
            }
            else
            {
                cout<<C[i][j]<<" ";
                visited[C[i][j]]=1;
                return;
            }
        }
    }
}
void print_D(){
    for(int i=100; i>=0; i--)
    {
        for(int j=0; j<D[i].size(); j++)
        {
            if(visited[D[i][j]]==1)
            {
                continue;
            }
            else
            {
                cout<<D[i][j]<<" ";
                visited[D[i][j]]=1;
                return;
            }
        }
    }
}

 

 

나중에 생각난것인데 그냥 sort 정렬 기준을 점수는 오름차순 출석번호는 내림차순으로 정렬해주게끔 cmp함수를 작성하는것이 훨씬 코드가 짧을거같다.