swea 17433 : 성적조회 c++

황연준·2024년 2월 16일
0

알고리즘

목록 보기
3/8
#include <iostream>
#include <unordered_map>
#include <set>
#include <algorithm>

using namespace std;

struct student {
	int id;
	int score;
};

// operator 암기 필수!
bool operator<(const student& a, const student& b) {
	if (a.score != b.score) { return a.score < b.score; }

	return a.id < b.id;
}
// score가 다르면 score 내림차순, 같으면 id 내림차순

set<student> st[3][2]; //set을 3차원으로 쓴다
unordered_map<int, tuple<int, int, int> > um; //3가지 정보 저장 위해 hash 사용


void init() {

	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 2; j++) {
			st[i][j].clear();
		}
	}
	um.clear();
	return;
}

int add(int mid, int grade, char gender[7], int score) {

	// 0번째 index를 1학년으로 생각하기 위해
	--grade;
	
    // 첫문자 비교로 남녀 결정
	auto& tmp = st[grade][gender[0] == 'm'];

	tmp.insert({ mid, score });
	
	// 3가지 정보 가져오기
	um[mid] = { grade, gender[0] == 'm', score };
	
    // reverse begin으로 mGrade, mGender중에 점수 가장높은애 return
	return tmp.rbegin()->id;
}

int remove(int mid) {

	//해당하는 ID 학생 없으면 0 return
	if (um.count(mid) == 0) { return 0; } //unordered_map.count!!

	int grade, gender, score;

	tie(grade, gender, score) = um[mid];

	auto& tmp = st[grade][gender];

	tmp.erase({ mid, score });

	um.erase(mid);

	if (tmp.empty()) {
		return 0;
	}

	return tmp.begin()->id;

}

int query(int gradecnt, int mGrade[], int mGenderCnt, char mGender[][7], int mScore) {

	student ans = { 0, (int)1e9 }; //(int)1e9
	for (int i = 0; i < gradecnt; i++) {
		int grade = mGrade[i] - 1; //index 맞춰주기 위해서 --
		for (int j = 0; j < mGenderCnt; j++) {
			int gender = (mGender[j][0] == 'm');

			auto& tmp = st[grade][gender];
            
            // lower_bound로 id가 0보다 크고 mScore보다 큰 첫번째 index 
			auto it = tmp.lower_bound({ 0,mScore });

			if (it != tmp.end()) {
				if (*it < ans) { //비교 연산자 사용
					ans = *it;
				}
			}

		}
	}

	return ans.id;
}
profile
서강대💻

0개의 댓글