본문 바로가기
알고리즘/C++

[백준] 13414 - 수강신청 by C++

by 엑츄얼리 2023. 6. 14.

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

 

13414번: 수강신청

입력 데이터는 표준 입력을 사용한다. 입력은 1개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 과목의 수강 가능 인원 K(1 ≤ K ≤ 100,000)와 학생들이 버튼을 클릭한 순서를 기록한 대기목

www.acmicpc.net

어려운 문제라기보다는 map을 사용하는데 익숙하지 않다보니, map을 이해하고 적응하는 과정인 것 같다.

 

알고리즘 방식

map 을 사용하여, key : 학번, value : 누른 순서 로 저장하였다.

위와 같이 저장함으로 써, 중복하여 누를 경우, 누른 순서가 최후의 순서로 갱신된다.

 

이후, map을 vector로 변환하여, 누른 순서를 기준으로 오름차순으로 정렬 후,

수강 가능 인원 수 만큼 출력

 

소스코드

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

using namespace std;

int K, L;
unordered_map<string, int> mp;

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

void input() {
	cin >> K >> L;

	string inp;
	for (int i = 1; i <= L; i++) {
		cin >> inp;
		//mp.insert(make_pair(inp, i));
		mp[inp] = i;
	}
}

void solution() {
	vector<pair<string, int>> v(mp.begin(), mp.end());
	sort(v.begin(), v.end(), cmp);

	for (int i = 0; i < (K < v.size() ? K : v.size()); i++) {
		cout << v[i].first << '\n';
	}
}

int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	input();

	solution();
}

 

기억해야할 부분

map -> vector 및 custom sorting;

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

map<string, int> mp;
vector<pair<string, int>> v(mp.begin(), mp.end());
sort(v.begin(), v.end(), cmp);

 

map에 대한 insert는 해당 key값에 대한 value가 존재할 경우 갱신되지 않는다.

mp.insert(make_pair(inp, i));
mp[inp] = i;
        
//insert의 경우 key: inp에 대한 value가 존재할 경우 해당 값이 i로 갱신되지 않지만,
//map[inp] = i 와 같은 방식의 경우 key: inp에 대한 value를 i로 갱신한다.

 

 

'알고리즘 > C++' 카테고리의 다른 글

[백준] 1238 - 파티 by C++  (0) 2023.08.17
[백준] 1261 - 알고스팟 by C++  (0) 2023.03.24
[백준] 23564 - 재귀 문자열 by C++  (0) 2023.01.27
[백준] 11265 - 끝나지 않는 파티  (0) 2023.01.20
[백준] 1520 - 내리막 길  (0) 2023.01.09

댓글