Whaeun Story

[BOJ 24509] 상품의 주인은? 풀이 본문

알고리즘/BOJ풀이

[BOJ 24509] 상품의 주인은? 풀이

whaeun 2022. 2. 23. 22:34

 

 친구가 이번 신촌 연합 겨울 알고리즘 캠프 대회의 문제를 출제했다고 연락이 와 문제를 풀어 보게 되었다. (의리의리 👻) 사실은 브론즈 문제 맛보라고 연락이 왔는데 실상은 실버5로 책정된........ 

 그렇게 풀게 된 문제의 지문을 읽어보니 정렬 문제여서 과목별로 벡터를 만들어서  정렬하게 되었다. 또한, 한 사람이 상품을 또 타갈 수 없다고 했으므로 학생 벡터를 만들어 해당 번호의 학생이 상품을 타갔는지 여부를 확인할 수 있도록 체크했다. cmp 함수를 직접 만들어서 사용했는데 학생의 번호가 더 작고 점수는 더 큰 사람이 앞에 와야 하므로 pair에서 second는 더 큰 것이 앞으로 first는 더 작은 것이 앞에 위치할 수 있도록 코드를 작성했다.

 계속 출제진으로 참여하던 대회에서 나온 문제들을 따로 풀어보니 감회가 새로웠던 것 같다. 이번에는 개인 사정으로 출제진에 지원하지 못했지만 다음 여름 캠프 때 기회가 된다면 출제진으로 다시 활동해 보고 싶다. 새로운 출제진 기준을 그 전에 맞출 수 있을...까..? 아자아자

 

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

vector<int>student;
vector<pair<int, int>>korea;
vector<pair<int, int>>english;
vector<pair<int, int>>math;
vector<pair<int, int>>science;

bool cmp(const pair<int, int> & a, const pair<int, int> & b) {
    if (a.second == b.second) {
        return a.first < b.first;
    }
    return a.second > b.second;
}


int main(){
    int n;
    
    cin >> n;
    
    for(int i = 0; i< n; i++){
        student.push_back(0);
    }
    
    for (int i = 0; i < n; i++){
        int st, k, e, m, s;
        
        cin >> st >> k >> e >> m >> s;
        
        korea.push_back({st, k});
        english.push_back({st, e});
        math.push_back({st, m});
        science.push_back({st, s});
        
    }
    
    sort(korea.begin(), korea.end(), cmp);
    sort(english.begin(), english.end(), cmp);
    sort(math.begin(), math.end(), cmp);
    sort(science.begin(), science.end(), cmp);

    
    cout << korea[0].first << " ";
    
    student[korea[0].first - 1] = 1;
    
    
    
    int english_best = 0;
    
    for (; english_best < n; english_best++){
        
        if(student[english[english_best].first - 1] == 0){
            break;
        }
        
    }
    
    cout << english[english_best].first << " ";
    student[english[english_best].first - 1] = 1;
    
    int math_best = 0;
    
    
    for (; math_best < n; math_best++){
        
        if(student[math[math_best].first - 1] == 0){
            break;
        }
        
    }
    
    cout << math[math_best].first << " ";
    student[math[math_best].first - 1] = 1;
    
    int sc_best = 0;
    
    
    for (; sc_best < n; sc_best++){
        if(student[science[sc_best].first - 1] == 0){
            break;
        }
    }
    
    cout << science[sc_best].first << " ";
    
}

 

'알고리즘 > BOJ풀이' 카테고리의 다른 글

[ BOJ 1260 ] DFS와 BFS 풀이  (0) 2023.04.08
[BOJ 1865] 웜홀 풀이  (0) 2022.10.30