컴굥일지

[BOJ/백준 13414][C++] 수강신청 본문

알고리즘/코테 문제

[BOJ/백준 13414][C++] 수강신청

gyong 2023. 8. 12. 15:07
반응형

문제

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

백준 13414

 

문제 내용

어떤 수업의 수강신청 학번 목록을 받는다.

여러 번 클릭한 학생은 자신이 얻은 순서의 가장 마지막 순서를 가지게 된다.

k명 수강 가능하다고 할 때, 해당 수업을 들을 수 있는 학생의 학번을 출력하면 된다.

 

문제 풀이

unordered_map으로 (학번, 대기순서)를 저장했다.

이후 해당 내역을 {대기 순서, 학번}의 형식으로 vector에 저장한 뒤, 정렬을 진행했다.

k명 이내에 드는 학생들만 출력하면 된다.

 

코드

#include <algorithm>
#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int k, L;
    cin >> k >> L;

    // 학번이 int면 00000000이 0으로 저장된다.
    unordered_map<string, int> waiting_list; // 학번, 순서
    int cnt = 0;
    string studentId;
    while (L--) {
        cin >> studentId;

        waiting_list[studentId] = cnt;
        cnt++;
    }

    // 순서를 기준으로 정렬 후
    vector<pair<int, string>> result_list; // 순서, 학번
    for (auto student : waiting_list) {
        result_list.push_back({student.second, student.first}); // 순서, 학번
    }
    sort(result_list.begin(), result_list.end());

    // 수강신청 순서대로 k개 출력 (인원이 k명이 안 될 경우 인원 수 만큼만 출력)
    for (int i = 0; i < k && i < result_list.size(); i++) {
        cout << result_list[i].second << "\n";
    }
}

 

문제 코드 설명

학번을 int로 받아버리면 00000000과 같은 학번이 0이 되어버린다.

따라서 학번은 string으로 받아야 한다.

반응형
Comments