- μμμ λ³λ‘ μ μμ λ°λ₯Έ heapμ λ§λ€κ³ μμμ μ μλ₯Ό μμ νλ©΄μ μ΅κ³ μ μ κ°μ§ μμμ μ°Ύμλ΄λ λ¬Έμ .
make_heap
μ μ¬μ©λ²μ΄ μ’ ν·κ°λ Έμλ κ² κ°λ€.make_heap
μ μ£Όμ΄μ§ comparator
λ₯Ό κΈ°μ€μΌλ‘ max heapμ λ§λ λ€.- λ°λΌμ μ μλ μ€λ¦μ°¨μ, μ΄λ¦μ λ΄λ¦Όμ°¨μμΌλ‘ κ³λ¨μ μ λ ¬νλ
comparator
λ₯Ό λ§λ€μ΄μΌ νλ€.
- max heapμ μ΅λ κ°μ κ°μ§ μμλ
vector
μ 첫λ²μ§Έ μμκ° λλ€. - μκ° λ³΅μ‘λλ μ΄ λλ€.
- μλ‘μ΄ κ°μ²΄λ₯Ό μμ±νλ λ°©μμΌλ‘ νμ΄μΌ μ μκ° μμ μ€νλ μ μλ€.
- κΈ°μ‘΄ κ°μ²΄λ₯Ό μμ νλ €λ©΄ λ§€λ² heapμ λ€μ μ λ ¬ν΄μΌ νλλ° μμ
μ μκ° μμμ μ μ λΉμ·νλ€κ³ κ°μ νλ©΄ μκ° λ³΅μ‘λλ κ° λλ€.
- 그보λ€λ κΈ°μ‘΄ κ°μ²΄λ₯Ό μ°Ύμμ λ§νΉ
invalidate = true
νκ³ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±νλ νΈμ΄ λ«λ€. - μλ‘μ΄ κ°μ²΄λ₯Ό μμ±ν΄μ λ£μ κ²½μ° μκ° λ³΅μ‘λλ μ΄ λλ€.
- μμ λ μ μμ κΈ°μ‘΄ μ μκ° κ°μ κ²½μ° μμ
μ 건λλ°λ κ²λ μ±λ₯μ μ΄λμ λ (μ€ν μκ° λ°±λΆμ 34% β 58%) μν₯μ΄ μλ€.
- μ΅κ³ μ μλ₯Ό κ°μ§ μμμ μ°Ύμ λ λ§νΉλ μμμ μ κ±°νλ€.
- heapμ μ΅κ³ μ μ κ°μ§ μμκ° λ§νΉλ μμμΈ κ²½μ°
pop_heap
μ ν΅ν΄μ μ κ±°νλ€.
- μ΄λ¦ - μμ, μμμ μ΄λ¦ - μμ λͺ©λ‘μ
map
μ μμ±ν λ keyμ μ λ ¬μ΄ νμ μμΌλ―λ‘ unordered_map
μ μ¬μ©νλ©΄ μ μλ―Έν μ±λ₯ ν₯μμ μ΄λμ΄λΌ μ μλ€ (μ€ν μκ° λ°±λΆμ 58% β 97%).
class FoodRatings {
public:
FoodRatings(vector<string>& foods, vector<string>& cuisines, vector<int>& ratings) {
// make all foods
for (int i = 0; i < foods.size(); ++i) {
auto food = make_shared<Food>(
Food{cuisines[i], foods[i], ratings[i]});
all_foods[food->name] = food;
all_cuisines[food->cuisine].push_back(food);
}
// make heaps for each cuisines
for (auto& entry : all_cuisines) {
make_heap(entry.second.begin(), entry.second.end(), compare);
}
}
void changeRating(string food, int newRating) {
// find food & check ratings
auto& ptr = all_foods[food];
if (ptr->rating == newRating) return;
// invalidate previous food
ptr->invalid = true;
// create new food
auto new_ptr = make_shared<Food>(
Food{ptr->cuisine, ptr->name, newRating});
// add new food
auto& foods = all_cuisines[ptr->cuisine];
foods.push_back(new_ptr);
push_heap(foods.begin(), foods.end(), compare);
all_foods[food] = new_ptr;
}
string highestRated(string cuisine) {
auto& foods = all_cuisines[cuisine];
// remove invalid foods from top of the heap
while (foods[0]->invalid) {
pop_heap(foods.begin(), foods.end(), compare);
foods.pop_back();
}
return foods[0]->name;
}
private:
struct Food {
string cuisine;
string name;
int rating;
bool invalid = false;
};
using FoodPtr = shared_ptr<Food>;
static bool compare(FoodPtr& lhs, FoodPtr& rhs) {
return (lhs->rating != rhs->rating)
? lhs->rating < rhs->rating
: lhs->name > rhs->name;
}
unordered_map<string, FoodPtr> all_foods;
unordered_map<string, vector<FoodPtr>> all_cuisines;
};