Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weโ€™ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

51-9kyo-hwang #185

Merged
merged 5 commits into from
Aug 11, 2024
Merged

51-9kyo-hwang #185

merged 5 commits into from
Aug 11, 2024

Conversation

9kyo-hwang
Copy link
Collaborator

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ

21944 ๋ฌธ์ œ ์ถ”์ฒœ ์‹œ์Šคํ…œ Version 2

โœ”๏ธ ์†Œ์š”๋œ ์‹œ๊ฐ„

1์‹œ๊ฐ„ ๋ฐ˜

โœจ ์ˆ˜๋„ ์ฝ”๋“œ

1. ๋ฌธ์ œ

21939 ๋ฌธ์ œ ์ถ”์ฒœ ์‹œ์Šคํ…œ Version 1์˜ ํ™•์žฅํŒ์ด๋‹ค.
๊ฐ ๋ฌธ์ œ๋งˆ๋‹ค ๋ฌธ์ œ ๋ฒˆํ˜ธ, ๋‚œ์ด๋„์— ์ด์— "์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ„๋ฅ˜" ์ •๋ณด๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.
์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ 5๊ฐ€์ง€ ๋ช…๋ น์–ด๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฌธ์ œ ์ถ”์ฒœ ์‹œ์Šคํ…œ์„ ์ž‘์„ฑํ•˜๋ผ.

๋ช…๋ น์–ด ์„ค๋ช…
recommendย ๐บย ๐‘ฅ ๐‘ฅ๊ฐ€ 1์ธ ๊ฒฝ์šฐ ์ถ”์ฒœ ๋ฌธ์ œ ๋ฆฌ์ŠคํŠธ์—์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ„๋ฅ˜๊ฐ€ย ๐บ์ธ ๋ฌธ์ œ ์ค‘ ๊ฐ€์žฅ ์–ด๋ ค์šด ๋ฌธ์ œย ๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ๋ผ๋ฉด ๊ทธ ์ค‘ย ๋ฌธ์ œ ๋ฒˆํ˜ธ๊ฐ€ ํฐ ๊ฒƒ์œผ๋กœ ์ถœ๋ ฅํ•œ๋‹ค.โ€Š
๐‘ฅ๊ฐ€ -1์ธ ๊ฒฝ์šฐ ์ถ”์ฒœ ๋ฌธ์ œ ๋ฆฌ์ŠคํŠธ์—์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ„๋ฅ˜๊ฐ€ย ๐บ์ธ ๋ฌธ์ œ ์ค‘ ๊ฐ€์žฅ ์‰ฌ์šด ๋ฌธ์ œ ๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ๋ผ๋ฉด ๊ทธ ์ค‘ย ๋ฌธ์ œ ๋ฒˆํ˜ธ๊ฐ€ ์ž‘์€ ๊ฒƒ์œผ๋กœ ์ถœ๋ ฅํ•œ๋‹ค.
ํ•ด๋‹น ๋ช…๋ น์–ด๋Š” ํ•ด๋‹น ๊ทธ๋ฃนย ๐บ์— ๋ฌธ์ œ ๋ฒˆํ˜ธ๊ฐ€ ํ•œ ๊ฐœ ์ด์ƒ์ด ์žˆ์„ ๊ฒฝ์šฐ์—๋งŒ ์ฃผ์–ด์ง„๋‹ค.
recommend2ย ๐‘ฅ ๐‘ฅ๊ฐ€ 1์ธ ๊ฒฝ์šฐ ์ถ”์ฒœ ๋ฌธ์ œ ๋ฆฌ์ŠคํŠธ์—์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ„๋ฅ˜ ์ƒ๊ด€์—†์ด ๊ฐ€์žฅ ์–ด๋ ค์šด ๋ฌธ์ œ ๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ๋ผ๋ฉด ๊ทธ ์ค‘ย ๋ฌธ์ œ ๋ฒˆํ˜ธ๊ฐ€ ํฐ ๊ฒƒ์œผ๋กœ ์ถœ๋ ฅํ•œ๋‹ค.โ€Š
๐‘ฅ๊ฐ€ -1์ธ ๊ฒฝ์šฐ ์ถ”์ฒœ ๋ฌธ์ œ ๋ฆฌ์ŠคํŠธ์—์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ„๋ฅ˜ ์ƒ๊ด€์—†์ดย ๊ฐ€์žฅ ์‰ฌ์šด ๋ฌธ์ œ ๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ๋ผ๋ฉด ๊ทธ ์ค‘ย ๋ฌธ์ œ ๋ฒˆํ˜ธ๊ฐ€ ์ž‘์€ ๊ฒƒ์œผ๋กœ ์ถœ๋ ฅํ•œ๋‹ค.
recommend3ย ๐‘ฅย ๐ฟ ๐‘ฅ๊ฐ€ 1์ธ ๊ฒฝ์šฐ ์ถ”์ฒœ ๋ฌธ์ œ ๋ฆฌ์ŠคํŠธ์—์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ„๋ฅ˜ ์ƒ๊ด€์—†์ด ๋‚œ์ด๋„ย ๐ฟ๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ๋ฌธ์ œ ์ค‘ ๊ฐ€์žฅ ์‰ฌ์šดย ๋ฌธ์ œ ๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ๋ผ๋ฉด ๊ทธ ์ค‘ย ๋ฌธ์ œ ๋ฒˆํ˜ธ๊ฐ€ ์ž‘์€ ๊ฒƒ์œผ๋กœ ์ถœ๋ ฅํ•œ๋‹ค.
๋งŒ์•ฝ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ฌธ์ œ ๋ฒˆํ˜ธ๊ฐ€ ์—†๋‹ค๋ฉดย -1์„ ์ถœ๋ ฅํ•œ๋‹ค.โ€Š
๐‘ฅ๊ฐ€ -1์ธ ๊ฒฝ์šฐ ์ถ”์ฒœ ๋ฌธ์ œ ๋ฆฌ์ŠคํŠธ์—์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ„๋ฅ˜ ์ƒ๊ด€์—†์ด ๋‚œ์ด๋„ย ๐ฟ๋ณด๋‹ค ์ž‘์€ ๋ฌธ์ œ ์ค‘ ๊ฐ€์žฅ ์–ด๋ ค์šด ๋ฌธ์ œ ๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ๋ผ๋ฉด ๊ทธ ์ค‘ย ๋ฌธ์ œ ๋ฒˆํ˜ธ๊ฐ€ ํฐ ๊ฒƒ์œผ๋กœ ์ถœ๋ ฅํ•œ๋‹ค.
๋งŒ์•ฝ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ฌธ์ œ ๋ฒˆํ˜ธ๊ฐ€ ์—†๋‹ค๋ฉดย -1์„ ์ถœ๋ ฅํ•œ๋‹ค.
addย ๐‘ƒย ๐ฟย ๐บ ์ถ”์ฒœ ๋ฌธ์ œ ๋ฆฌ์ŠคํŠธ์— ๋‚œ์ด๋„๊ฐ€ย ๐ฟ์ด๊ณ  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ„๋ฅ˜๊ฐ€ย ๐บ์ธ ๋ฌธ์ œ ๋ฒˆํ˜ธย ๐‘ƒ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. (์ถ”์ฒœ ๋ฌธ์ œ ๋ฆฌ์ŠคํŠธ์— ์—†๋Š” ๋ฌธ์ œ ๋ฒˆํ˜ธย ๐‘ƒ๋งŒ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค. ์ด์ „์— ์ถ”์ฒœ ๋ฌธ์ œ ๋ฆฌ์ŠคํŠธ์— ์žˆ๋˜ ๋ฌธ์ œ ๋ฒˆํ˜ธ๊ฐ€ ๋‹ค๋ฅธ ๋‚œ์ด๋„์™€ ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ„๋ฅ˜๋กœ ๋‹ค์‹œ ๋“ค์–ด ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.)
solvedย ๐‘ƒ ์ถ”์ฒœ ๋ฌธ์ œ ๋ฆฌ์ŠคํŠธ์—์„œ ๋ฌธ์ œ ๋ฒˆํ˜ธย ๐‘ƒ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค. (์ถ”์ฒœ ๋ฌธ์ œ ๋ฆฌ์ŠคํŠธ์— ์žˆ๋Š” ๋ฌธ์ œ ๋ฒˆํ˜ธย ๐‘ƒ๋งŒ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค.)

์ œํ•œ

  • $1 \le N, P \le 100,000$โ€Š
  • $1 \le M \le 10,000$โ€Š
  • $1 \le L, G \le 100$, $L$์™€ $G$์€ ์ž์—ฐ์ˆ˜
  • $x = \pm 1$โ€Š

2. ํ’€์ด

int main()
{
    cin.tie(nullptr)->sync_with_stdio(false);
    
    Database* DB = new Database();
    
    int N; cin >> N;
    while(N--)
    {
        int P, L, G; cin >> P >> L >> G;
        DB->Add(P, L, G);
    }
    
    int M; cin >> M;
    while(M--)
    {
        string Command; cin >> Command;
        if(Command == "recommend")  // find Max/Min in Category G
        {
            int G, x; cin >> G >> x;
            cout << DB->Recommend1(G, x) << "\n";
        }
        else if(Command == "recommend2")  // find Max/Min any Category
        {
            int x; cin >> x;
            cout << DB->Recommend2(x) << "\n";
        }
        else if(Command == "recommend3")  // find lower bound
        {
            int x, L; cin >> x >> L;
            cout << DB->Recommend3(x, L) << "\n";
        }
        else if(Command == "add")
        {
            int P, L, G; cin >> P >> L >> G;
            DB->Add(P, L, G);
        }
        else if(Command == "solved")
        {
            int P; cin >> P;
            DB->Solved(P);
        }
    }
    
    delete DB;
    
    return 0;
}

Database๋ผ๋Š” ์ด๋ฆ„์˜ ์ปค์Šคํ…€ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.
ํ•ด๋‹น ํด๋ž˜์Šค์—๋Š” Recommend1(), Recommend2(), Recommend3(), Add(), Solved() ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌํ•ด ๊ฐ๊ฐ์˜ Command์— ๋Œ€์‘ํ•œ๋‹ค.
์ฃผ์–ด์ง€๋Š” N๊ฐœ์˜ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ๋“ค์„ Add()๋ฅผ ํ†ตํ•ด ์ €์žฅํ•œ ๋’ค, M๊ฐœ์˜ ๋ช…๋ น์–ด๋ฅผ ๊ฐ๊ฐ์˜ ์ปค๋งจ๋“œ์— ๋งž๊ฒŒ ํ˜ธ์ถœํ•œ๋‹ค.

class Database
{
public:
    ...
private:
    set<int> ProblemByLevel[101];
    set<int> ProblemByLevelAndGroup[101][101];
    pair<int, int> Problems[100001];

    ...
};

๊ธฐ๋ณธ์ ์œผ๋กœ Database ํด๋ž˜์Šค๋Š” 3๊ฐœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ฐ–๋Š”๋‹ค.

  • ๋ ˆ๋ฒจ ๋ณ„๋กœ ๊ทธ๋ฃนํ•‘ํ•ด์„œ ๋ฌธ์ œ ๋ฒˆํ˜ธ๋“ค์„ ์ €์žฅํ•˜๋Š” ProblemByLevel set
  • ๋ ˆ๋ฒจ ์ •๋ณด์™€ ๋ถ„๋ฅ˜ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ๋ฌธ์ œ ๋ฒˆํ˜ธ๋“ค์„ ์ €์žฅํ•˜๋Š” ProblemByLevelAndGroup set
  • ๋ฌธ์ œ ๋ฒˆํ˜ธ๋งˆ๋‹ค {๋‚œ์ด๋„, ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ„๋ฅ˜} ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” Problems ๋ฐฐ์—ด

์ฐธ๊ณ ๋กœ set์„ ์‚ฌ์šฉํ•œ ์ด์œ ๋Š” ๊ฐ๊ฐ์˜ ๋ช…๋ น์–ด๋“ค์ด "์ตœ๋Œ€/์ตœ์†Œ ๋ฌธ์ œ ๋ฒˆํ˜ธ", "๊ฐ€์žฅ ์–ด๋ ค์šด/์‰ฌ์šด ๋‚œ์ด๋„" ๋“ฑ์„ ์ง€์†์ ์œผ๋กœ ์š”๊ตฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
c++์—์„œ set์€ "์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ"๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ ฌ๋œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•œ๋‹ค.

class Database
{
public:
    ...
    void Add(int P, int L, int G)
    {
        ProblemByLevel[L].emplace(P);
        ProblemByLevelAndGroup[L][G].emplace(P);
        Problems[P] = {L, G};
    }
    
    void Solved(int P)
    {
        ProblemByLevel[Problems[P].first].erase(P);  // Problems์˜ first๋Š” ๋‚œ์ด๋„ L
        ProblemByLevelAndGroup[Problems[P].first][Problems[P].second].erase(P);  // second๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ„๋ฅ˜ G
    }

private:
    ...
}

Add() ๋ฉ”์„œ๋“œ๋Š” ๋ฌธ์ œ ๋ฒˆํ˜ธ P, ๋ฌธ์ œ ๋‚œ์ด๋„ L, ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ„๋ฅ˜ G ์ •๋ณด๋ฅผ ๋„˜๊ฒจ๋ฐ›์•„ ๊ฐ๊ฐ์˜ ์ž๋ฃŒ๊ตฌ์กฐ์— ๋งž๊ฒŒ ์ €์žฅํ•œ๋‹ค.
Solved() ๋ฉ”์„œ๋“œ๋Š” ๋ฌธ์ œ ๋ฒˆํ˜ธ P๋ฅผ ๋„˜๊ฒจ๋ฐ›์•„ ProblemByLevel set, ProblemByLevelAndGroup set์— ์ €์žฅ๋œ ๋ฌธ์ œ ์ •๋ณด๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.

public:
    int Recommend1(int G, int x)
    {
        if(x == 1)
        {
            return Recommend1P(G);
        }
        else if(x == -1)
        {
            return Recommend1N(G);
        }
    }

private:
    int Recommend1P(int G)
    {
        for(int L = 100; L >= 1; --L)
        {
            if(!ProblemByLevelAndGroup[L][G].empty())
            {
                return *(--ProblemByLevelAndGroup[L][G].end());
            }
        }
    }
    
    int Recommend1N(int G)
    {
        for(int L = 1; L <= 100; ++L)
        {
            if(!ProblemByLevelAndGroup[L][G].empty())
            {
                return *ProblemByLevelAndGroup[L][G].begin();
            }
        }
    }

์ฃผ์–ด์ง„ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ„๋ฅ˜ G์—์„œ ๊ฐ€์žฅ ์–ด๋ ค์šด/์‰ฌ์šด ๋ฌธ์ œ ๋ฒˆํ˜ธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.
x๊ฐ€ 1์ด๋ฉด Recommend1P() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , -1์ด๋ฉด Recommend1N() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  • P() ๋ฉ”์„œ๋“œ๋Š” ๋‚œ์ด๋„ ์ตœ๋Œ€๊ฐ’์ธ 100๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ๋‚ฎ์ถฐ๋ณด๋ฉฐ ํ•ด๋‹น ๋ถ„๋ฅ˜ G์—์„œ ์ฒ˜์Œ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ•˜๋Š” ๋‚œ์ด๋„ L์„ ๋ฐœ๊ฒฌํ•˜๋ฉด, ๊ทธ ๋‚œ์ด๋„์— ์†ํ•˜๋Š” ๋ฌธ์ œ๋“ค ์ค‘์—์„œ ๊ฐ€์žฅ ํฐ ๋ฒˆํ˜ธ(end())๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • N() ๋ฉ”์„œ๋“œ๋Š” ๋‚œ์ด๋„ ์ตœ์†Œ๊ฐ’์ธ 1๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ์˜ฌ๋ ค๋ณด๋ฉฐ ํ•ด๋‹น ๋ถ„๋ฅ˜ G์—์„œ ์ฒ˜์Œ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ•˜๋Š” ๋‚œ์ด๋„ L์„ ๋ฐœ๊ฒฌํ•˜๋ฉด, ๊ทธ ๋‚œ์ด๋„์— ์†ํ•˜๋Š” ๋ฌธ์ œ๋“ค ์ค‘์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๋ฒˆํ˜ธ(begin())๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
public:
    int Recommend2(int x)
    {
        if(x == 1)
        {
            return Recommend2P();
        }
        else if(x == -1)
        {
            return Recommend2N();
        }
    }

private:
    int Recommend2P()
    {
        for(int L = 100; L >= 1; --L)
        {
            if(!ProblemByLevel[L].empty())
            {
                return *(--ProblemByLevel[L].end());
            }
        }
    }
    
    int Recommend2N()
    {
        for(int L = 1; L <= 100; ++L)
        {
            if(!ProblemByLevel[L].empty())
            {
                return *ProblemByLevel[L].begin();
            }
        }
    }

๋ชจ๋“  ๋ฌธ์ œ์— ๋Œ€ํ•ด์„œ ๊ฐ€์žฅ ์–ด๋ ค์šด/์‰ฌ์šด ๋ฌธ์ œ ๋ฒˆํ˜ธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ์œ„์™€ ๋™์ผํ•˜๊ฒŒ x == 1์ด๋ฉด P, -1์ด๋ฉด N์„ ํ˜ธ์ถœํ•œ๋‹ค.

  • P() ๋ฉ”์„œ๋“œ๋Š” L = 100๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ํ•˜๋‚˜์”ฉ ๋‚ฎ์ถฐ๋ณด๋ฉฐ ์ฒ˜์Œ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ•˜๋Š” ๋‚œ์ด๋„๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด, ๊ทธ ๋‚œ์ด๋„์— ์†ํ•˜๋Š” ๋ฌธ์ œ๋“ค ์ค‘ ๊ฐ€์žฅ ํฐ ๋ฒˆํ˜ธ(end())๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • N() ๋ฉ”์„œ๋“œ๋Š” L = 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ํ•˜๋‚˜์”ฉ ๋†’์—ฌ๋ณด๋ฉฐ ์ฒ˜์Œ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ•˜๋Š” ๋‚œ์ด๋„๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด, ๊ทธ ๋‚œ์ด๋„์— ์†ํ•˜๋Š” ๋ฌธ์ œ๋“ค ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๋ฒˆํ˜ธ(begin())๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
public:
    int Recommend3(int x, int L)
    {
        if(x == 1)
        {
            return Recommend3P(L);
        }
        else if(x == -1)
        {
            return Recommend3N(L);
        }
    }

private:
    int Recommend3P(int L)
    {
        for(; L <= 100; ++L)
        {
            if(!ProblemByLevel[L].empty())
            {
                return *ProblemByLevel[L].begin();
            }
        }
        return -1;
    }
    
    int Recommend3N(int L)
    {
        for(L -= 1; L >= 1; --L)
        {
            if(!ProblemByLevel[L].empty())
            {
                return *(--ProblemByLevel[L].end());
            }
        }
        return -1;
    }

์ฃผ์–ด์ง„ ๋‚œ์ด๋„ L๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€/์ž‘์€ ๋ฌธ์ œ๋“ค ์ค‘์—์„œ ๊ฐ€์žฅ ์ž‘์€/ํฐ ๋ฌธ์ œ ๋ฒˆํ˜ธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

  • P() ๋ฉ”์„œ๋“œ๋Š” ์ฃผ์–ด์ง„ ๋‚œ์ด๋„ L๋ถ€ํ„ฐ 100๊นŒ์ง€ ํ•˜๋‚˜์”ฉ ์˜ฌ๋ ค๋ณด๋ฉฐ ์ฒ˜์Œ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ•˜๋Š” ๋‚œ์ด๋„๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด, ๊ทธ ๋‚œ์ด๋„์— ์†ํ•˜๋Š” ๋ฌธ์ œ๋“ค ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๋ฒˆํ˜ธ(begin())๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • N() ๋ฉ”์„œ๋“œ๋Š” ์ฃผ์–ด์ง„ ๋‚œ์ด๋„ L - 1๋ถ€ํ„ฐ 1๊นŒ์ง€ ํ•˜๋‚˜์”ฉ ๋‚ฎ์ฒ˜๋ณด๋ฉฐ ์ฒ˜์Œ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ•˜๋Š” ๋‚œ์ด๋„๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด, ๊ทธ ๋‚œ์ด๋„์— ์†ํ•˜๋Š” ๋ฌธ์ œ๋“ค ์ค‘ ๊ฐ€์žฅ ํฐ ๋ฒˆํ˜ธ(end())๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ „์ฒด ์ฝ”๋“œ

C++

#include <iostream>
#include <set>

using namespace std;

class Database
{
public:
    int Recommend1(int G, int x)
    {
        if(x == 1)
        {
            return Recommend1P(G);
        }
        else if(x == -1)
        {
            return Recommend1N(G);
        }
    }
    
    int Recommend2(int x)
    {
        if(x == 1)
        {
            return Recommend2P();
        }
        else if(x == -1)
        {
            return Recommend2N();
        }
    }
    
    int Recommend3(int x, int L)
    {
        if(x == 1)
        {
            return Recommend3P(L);
        }
        else if(x == -1)
        {
            return Recommend3N(L);
        }
    }

    void Add(int P, int L, int G)
    {
        ProblemByLevel[L].emplace(P);
        ProblemByLevelAndGroup[L][G].emplace(P);
        Problems[P] = {L, G};
    }
    
    void Solved(int P)
    {
        ProblemByLevel[Problems[P].first].erase(P);
        ProblemByLevelAndGroup[Problems[P].first][Problems[P].second].erase(P);
    }
    
private:
    set<int> ProblemByLevel[101];
    set<int> ProblemByLevelAndGroup[101][101];
    pair<int, int> Problems[100001];
    
    int Recommend1P(int G)
    {
        for(int L = 100; L >= 1; --L)
        {
            if(!ProblemByLevelAndGroup[L][G].empty())
            {
                return *(--ProblemByLevelAndGroup[L][G].end());
            }
        }
    }
    
    int Recommend1N(int G)
    {
        for(int L = 1; L <= 100; ++L)
        {
            if(!ProblemByLevelAndGroup[L][G].empty())
            {
                return *ProblemByLevelAndGroup[L][G].begin();
            }
        }
    }
    
    int Recommend2P()
    {
        for(int L = 100; L >= 1; --L)
        {
            if(!ProblemByLevel[L].empty())
            {
                return *(--ProblemByLevel[L].end());
            }
        }
    }
    
    int Recommend2N()
    {
        for(int L = 1; L <= 100; ++L)
        {
            if(!ProblemByLevel[L].empty())
            {
                return *ProblemByLevel[L].begin();
            }
        }
    }
    
    int Recommend3P(int L)
    {
        for(; L <= 100; ++L)
        {
            if(!ProblemByLevel[L].empty())
            {
                return *ProblemByLevel[L].begin();
            }
        }
        return -1;
    }
    
    int Recommend3N(int L)
    {
        for(L -= 1; L >= 1; --L)
        {
            if(!ProblemByLevel[L].empty())
            {
                return *(--ProblemByLevel[L].end());
            }
        }
        return -1;
    }
};

int main()
{
    cin.tie(nullptr)->sync_with_stdio(false);
    
    Database* DB = new Database();
    
    int N; cin >> N;
    while(N--)
    {
        int P, L, G; cin >> P >> L >> G;
        DB->Add(P, L, G);
    }
    
    int M; cin >> M;
    while(M--)
    {
        string Command; cin >> Command;
        if(Command == "recommend")  // find Max/Min in Category G
        {
            int G, x; cin >> G >> x;
            cout << DB->Recommend1(G, x) << "\n";
        }
        else if(Command == "recommend2")  // find Max/Min any Category
        {
            int x; cin >> x;
            cout << DB->Recommend2(x) << "\n";
        }
        else if(Command == "recommend3")  // find lower bound
        {
            int x, L; cin >> x >> L;
            cout << DB->Recommend3(x, L) << "\n";
        }
        else if(Command == "add")
        {
            int P, L, G; cin >> P >> L >> G;
            DB->Add(P, L, G);
        }
        else if(Command == "solved")
        {
            int P; cin >> P;
            DB->Solved(P);
        }
    }
    
    delete DB;
    
    return 0;
}

๐Ÿ“š ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ๋œ ๋‚ด์šฉ

์ง€๋‚œ 49๋ฒˆ PR์˜ ์•ฝ๊ฐ„ ํ™•์žฅ๋œ ๋ฒ„์ „์ด๋ผ ์ˆ˜์›”ํ•˜๊ฒŒ ํ’€ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•˜์œผ๋‚˜... ๊ดœํžˆ ์†๋„ ๋น ๋ฅด๊ฒŒ ํ•ด๋ณด๊ฒ ๋‹ค๊ณ  ๋ณต์žกํ•˜๊ฒŒ ์ ‘๊ทผํ–ˆ๋‹ค๊ฐ€ ๋œํ†ต ์‹œ๊ฐ„ ๋‚ ๋ฆฌ๊ณ  ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ฐˆ์•„์—Ž๋Š” ๊ฒƒ๋งŒ ๋ช‡ ๋ฒˆ ํ–ˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ๋”ฐ...

์‹ฌ์ง€์–ด ์ฒ˜๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜๋‚˜ ์‹ถ์€ ๊ฒƒ๋“ค๋„ ์ฐพ์•„๋ณด๋‹ˆ ๋‹จ์ˆœํ•˜๊ฒŒ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ์Šˆ๋ฃจ๋ฃฉ ํ•˜๋ฉด ํ•ด๊ฒฐ๋˜๋Š” ๊ฑฐ ๋ณด๊ณ  ์ข€ ํ—ˆํƒˆํ•ด์ง... ใ…‹ใ…‹

Copy link
Member

@xxubin04 xxubin04 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Version 1์—์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ„๋ฅ˜๊ฐ€ ๋”ํ•ด์ ธ์„œ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ฐ์ด ์ž˜ ์•ˆ์žกํ˜”๋„ค์š”...
3๊ฐœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ์— ์ •๋ณด๋“ค์„ ์ €์žฅํ•ด์„œ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ฐพ์•„ ๋ฝ‘์•„๋‚ด๋„๋ก ๊ตฌํ˜„ํ•˜์…จ๊ตฐ์š”!

์•ž์˜ Version 1์—์„œ๋Š” recommend์—์„œ 1๊ณผ -1๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด max, min_heap ์„ ์‚ฌ์šฉํ•˜์…จ์—ˆ๋Š”๋ฐ ์ด๋ฒˆ์—๋Š” P(), N() ๋ฉ”์†Œ๋“œ๋กœ ๊ตฌํ˜„ํ•˜์…จ๋„ค์š”!
๊ทธ ์ด์œ ๊ฐ€ recommend1~3์œผ๋กœ ๋Š˜์–ด๋‚˜๋ฉด์„œ ๋ฉ”์†Œ๋“œ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฒŒ ํ›ค์”ฌ ํŽธํ•˜๊ธฐ ๋•Œ๋ฌธ์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค!

์ฝ”๋“œ ํ•˜๋‚˜ํ•˜๋‚˜์”ฉ ์ฝ์–ด๋ณด๋ฉด์„œ ๊ถ๊ธˆํ•œ ๊ฑด ๋ฌผ์–ด๋ณด๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ, PR์ด ์™„๋ฒฝ ๊ทธ ์ž์ฒด์—ฌ์„œ ๋ฌผ์–ด๋ณผ ๊ฒŒ ์—†์Šต๋‹ˆ๋‹ค... ์—ญ์‹œ ๊ฐ“๐Ÿ‘๐Ÿป

Copy link
Collaborator

@mjj111 mjj111 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ํ•ด๋‹น ๋ฐฑ์ค€ ๋ฌธ์ œ์—์„œ N๊ณผ M์— ๋Œ€ํ•œ ํฌ๊ธฐ๊ฐ€ ์ปค์„œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ณ ๋ฏผํ•ด์•ผํ–ˆ๋Š”๋ฐ์˜

์ •๋ ฌ, ์‚ญ์ œ, ์ถ”๊ฐ€๊ฐ€ ๋นจ๋ผ์•ผ ํ•˜๋Š”๋ฐ ์ •๋ ฌ๋œ Set ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ํ•„์š”ํ•˜๋”๊ตฐ์š” ใ…‹ใ…‹ใ…‹ ใ… 
๊ทธ๋ž˜์„œ TreeSet ํ•™์Šตํ•ด์„œ ํ’€์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ ํŠน์ •ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์š”๊ตฌํ•˜๋‹ˆ ์‹ ๋ฐ•ํ•˜๋„ค์š”ใ…Žใ……ใ…Ž

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException {
        StringBuilder sb = new StringBuilder();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        TreeSet<Problem> tree = new TreeSet<>();
        List<TreeSet<Problem>> subtrees = new ArrayList<>();
        for (int i = 0; i <= 100; i++) {
            subtrees.add(new TreeSet<>());
        }

        HashMap<Integer, int[]> hMap = new HashMap<>();

        for (int i = 0; i < N; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int no = Integer.parseInt(st.nextToken());
            int level = Integer.parseInt(st.nextToken());
            int group = Integer.parseInt(st.nextToken());

            Problem p = new Problem(no, level, group);
            subtrees.get(group).add(p);
            tree.add(p);
            hMap.put(no, new int[]{level, group});
        }

        int M = Integer.parseInt(br.readLine());
        for (int i = 0; i < M; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            String command = st.nextToken();

            if (command.equals("recommend")) {
                int group = Integer.parseInt(st.nextToken());
                int x = Integer.parseInt(st.nextToken());
                if (x == 1) {
                    sb.append(subtrees.get(group).last().no).append("\n");
                } else {
                    sb.append(subtrees.get(group).first().no).append("\n");
                }
            } else if (command.equals("recommend2")) {
                int x = Integer.parseInt(st.nextToken());
                if (x == 1) {
                    sb.append(tree.last().no).append("\n");
                } else {
                    sb.append(tree.first().no).append("\n");
                }
            } else if (command.equals("recommend3")) {
                int x = Integer.parseInt(st.nextToken());
                int level = Integer.parseInt(st.nextToken());
                if (x == 1) {
                    Problem p = tree.ceiling(new Problem(0, level, 0));
                    sb.append(p == null ? -1 : p.no).append("\n");
                } else {
                    Problem p = tree.lower(new Problem(0, level, 0));
                    sb.append(p == null ? -1 : p.no).append("\n");
                }
            } else if (command.equals("add")) {
                int no = Integer.parseInt(st.nextToken());
                int level = Integer.parseInt(st.nextToken());
                int group = Integer.parseInt(st.nextToken());

                Problem p = new Problem(no, level, group);
                subtrees.get(group).add(p);
                tree.add(p);
                hMap.put(no, new int[]{level, group});
            } else if (command.equals("solved")) {
                int no = Integer.parseInt(st.nextToken());
                if (!hMap.containsKey(no)) continue;

                int[] info = hMap.get(no);
                int level = info[0];
                int group = info[1];

                Problem p = new Problem(no, level, group);
                hMap.remove(no);
                tree.remove(p);
                subtrees.get(group).remove(p);
            }
        }

        System.out.println(sb.toString());
    }

    static class Problem implements Comparable<Problem> {
        int no;
        int level;
        int group;

        public Problem(int no, int level, int group) {
            this.no = no;
            this.level = level;
            this.group = group;
        }

        @Override
        public int compareTo(Problem o) {
            if (level == o.level) {
                return Integer.compare(no, o.no);
            }
            return Integer.compare(level, o.level);
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj) return true;
            if (obj == null || getClass() != obj.getClass()) return false;

            Problem other = (Problem) obj;
            return no == other.no && level == other.level && group == other.group;
        }

        @Override
        public int hashCode() {
            return Objects.hash(no, level, group);
        }
    }
}

@9kyo-hwang 9kyo-hwang removed the request for review from gjsk132 August 11, 2024 12:55
@9kyo-hwang 9kyo-hwang merged commit 52e1780 into main Aug 11, 2024
6 checks passed
@9kyo-hwang 9kyo-hwang deleted the 51-9kyo-hwang branch August 11, 2024 12:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants