https://www.acmicpc.net/problem/13414
문제
국민대학교에서는 매 학기 시작 전 종합정보시스템에서 수강신청을 한다. 매 수강신청마다 아주 많은 학생들이 몰려 서버에 많은 부하가 가기 때문에, 국민대학교에서는 수강신청 부하 관리 시스템을 도입하기로 결정하였다. 새로운 관리 시스템은 다음과 같은 방식으로 동작한다.
- 수강신청 버튼이 활성화 된 후, 수강신청 버튼을 조금이라도 빨리 누른 학생이 대기목록에 먼저 들어간다.
- 이미 대기열에 들어가 있는 상태에서 다시 수강신청 버튼을 누를 경우 대기목록의 맨 뒤로 밀려난다.
- 잠시 후 수강신청 버튼이 비활성화 되면, 대기목록에서 가장 앞에 있는 학생부터 자동으로 수강신청이 완료되며, 수강 가능 인원이 꽉 찰 경우 나머지 대기목록은 무시하고 수강신청을 종료한다.
위의 표는 최대 수강 가능 인원이 3명인 알고리즘 수업에 대해 6명의 학생이 수강신청을 진행한 모습이다. 버튼이 비활성화 된 후, 먼저 규칙 1을 적용하여 클릭을 2번 이상 한 학생의 중복된 대기목록을 삭제한다. 중복된 목록을 제거한 후, 맨 앞에서부터 최대 수강 가능 인원인 3명을 선정한다. 표의 맨 오른쪽에는 그 최종결과를 나타낸 모습이다. 이와 같은 방법을 이용하여 최종적으로 수강신청에 성공한 인원을 출력하는 프로그램을 작성하시오.
입력
입력 데이터는 표준 입력을 사용한다. 입력은 1개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 과목의 수강 가능 인원 K(1 ≤ K ≤ 100,000)와 학생들이 버튼을 클릭한 순서를 기록한 대기목록의 길이 L(1 ≤ L ≤ 500,000)이 주어진다. 두 번째 줄부터 L개의 줄에는 수강신청을 버튼을 클릭한 학생의 학번이 클릭 순서대로 주어진다. 학번은 8자리의 숫자로 이루어져 있다.
출력
출력은 표준 출력을 사용한다. 입력받은 데이터에 대해, 수강신청 관리 시스템의 규칙을 적용한 후 수강신청에 성공한 인원의 학번을 한 줄에 1개씩 출력한다.
문제 풀이
map을 이용한 문제.
학번과 순서를 <key, value>로 하는 map을 만들어 입력받은 데이터를 저장한다. 만약 map에 데이터가 있다면 다시 수강신청 버튼을 누른 것이므로 대기목록의 맨 뒤로 밀려나게 된다. 따라서 value를 현재 순서로 갱신해준다. 모든 데이터를 입력받았다면 vector로 재저장하여 순서 순으로 정렬한 후 K번째까지 출력해준다.
아래는 코드.
#include <iostream>
#include <map>
#include <vector>
#include <utility>
#include <algorithm>
using namespace std;
bool cmp(pair<string, int>& p1, pair<string, int>& p2)
{
if (p1.second < p2.second)
{
return true;
}
else
{
return false;
}
}
int main()
{
cin.tie(NULL);
ios::sync_with_stdio(false);
int N, M;
string str;
cin >> N >> M;
map<string, int> m;
map<string, int>::iterator it;
vector<pair<string, int>> v;
for (int i = 0; i < M; i++)
{
cin >> str;
it = m.find(str);
if (it == m.end())
{
m.insert({ str, i });
}
else
{
it->second=i;
}
}
for (it = m.begin(); it != m.end(); it++)
{
v.push_back(make_pair(it->first, it->second));
}
sort(v.begin(), v.end(), cmp);
for (int i = 0; i < min(N, (int)v.size()); i++)
{
cout << v.at(i).first << "\n";
}
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준 20126] 교수님의 기말고사 (C++) (0) | 2024.03.26 |
---|---|
[백준 10986] 나머지 합 (C++) (0) | 2024.03.25 |
[백준 1327] 소트 게임 (C++) (0) | 2024.03.23 |
[백준 11657] 타임머신 (C++) (0) | 2024.03.22 |
[백준 2461] 대표 선수 (C++) (0) | 2024.03.21 |