1차 시도 : BST(Binary Search Tree)

힙을 사용해서 푸는 문제인 것 같길래 처음엔 이진 트리를 구현해보려 했다.
하지만 Node를 삭제하는 부분에서 고난을 겪고 노선을 틀었다.
이진 트리의 구현에 대해서 더 공부를 해야할 것 같다.

#include <string>
#include <vector>
#include <iostream>
using namespace std;

struct Node {
    int data;
    Node* left;
    Node* right;
    Node(int data) {
        this->data = data;
        this->left = NULL;
        this->right = NULL;
    }
};

Node* root = new Node(NULL);

int convert(string target) {
    string temp = "";
    for (int i = 2; i < target.size(); i++)
        temp += target[i];

    return stoi(temp);
}

Node* tree_insert(Node* node, int data) {
    if (root->data == NULL) {
        root->data = data;
        return node;
    }
    else {
        if (node == NULL)
            node = new Node(data);
        else {
            if (data < node->data)
                node->left = tree_insert(node->left, data);
            else
                node->right = tree_insert(node->right, data);
        }
    }

    return node;
}

Node* find_max(Node* node) {
    if (node->right != NULL)
        find_max(node->right);
    else
        return node;
}

Node* find_min(Node* node) {
    if (node->left != NULL)
        find_min(node->left);
    else
        return node;
}

void tree_delete(int cmd) {
    if (root == NULL) return;

    if (cmd == 1) *find_max(root) = NULL;
    if (cmd == -1) *find_min(root) = NULL;
}

vector<int> solution(vector<string> operations) {
    vector<int> answer;

    for (int i = 0; i < operations.size(); i++) {
        switch (operations[i][0])
        {
        case 'I':
            tree_insert(root, convert(operations[i]));
            break;
        case 'D':
            tree_delete(convert(operations[i]));
            break;
        }
    }

    answer.push_back(find_max(root)->data);
    answer.push_back(find_min(root)->data);
    return answer;
}

2차 시도 : Set 이용

2차 시도에서는 이진 균형 트리의 Container인 Set을 이용했다.
Set의 최대 최소를 찾아서 지우고, 반환했다.

#include <string>
#include <vector>
#include <set>
using namespace std;

set<int> balanced_tree;

int convert(string target) {
    string temp = "";
    for (int i = 2; i < target.size(); i++)
        temp += target[i];

    return stoi(temp);
}

void delete_element(int cmd) {
    if (balanced_tree.empty()) return;

    int max_v = *balanced_tree.begin();
    int min_v = *(--balanced_tree.end());
    if (cmd == 1) balanced_tree.erase(min_v);
    if (cmd == -1) balanced_tree.erase(max_v);
}

vector<int> solution(vector<string> operations) {
    vector<int> answer;

    for (int i = 0; i < operations.size(); i++) {
        switch (operations[i][0])
        {
        case 'I':
            balanced_tree.insert(convert(operations[i]));
            break;
        case 'D':
            delete_element(convert(operations[i]));
            break;
        }
    }

    if (balanced_tree.empty()) {
        answer.push_back(0);
        answer.push_back(0);
    }
    else {
        answer.push_back(*(--balanced_tree.end()));
        answer.push_back(*balanced_tree.begin());
    }
    return answer;
}