Hello Ocean! ๐ŸŒผ

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/C++] ํ‘œ ํŽธ์ง‘ ๋ณธ๋ฌธ

Algorithm

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/C++] ํ‘œ ํŽธ์ง‘

bba_dda 2021. 12. 8. 20:27
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

https://programmers.co.kr/learn/courses/30/lessons/81303#

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ํ‘œ ํŽธ์ง‘

8 2 ["D 2","C","U 3","C","D 4","C","U 2","Z","Z"] "OOOOXOOO" 8 2 ["D 2","C","U 3","C","D 4","C","U 2","Z","Z","U 1","C"] "OOXOXOOO"

programmers.co.kr

ํ’€์ด

boolํ˜•ํƒœ์˜ idxs๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ, ํ•ด๋‹น ํ–‰์ด ์‚ญ์ œ๋˜๋ฉด 0, ์กด์žฌํ•˜๋ฉด 1๋กœ ํŒ๋‹จํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•ด๋ณด์•˜๋‹ค.

#include <string>
#include <vector>
#include <stack>
#include <iostream>

using namespace std;

string solution(int n, int k, vector<string> cmd) {
    stack<int> removed;
    vector<bool> idxs(n,1); // 1:์กด์žฌ, 0:์‚ญ์ œ๋จ
    int lastIdx = n-1;
    string answer = "";
    int tempIdx = k;
    for (auto c: cmd) {
        if (c[0] == 'U') {
            int num = stoi(c.substr(2,8));
            //cout << "num :" << num;
            int count = 0;
            while (count < num) {
                if (idxs[--tempIdx]) count++;
            }
        }
        if (c[0] == 'D') {
            int num = stoi(c.substr(2,8));
            int count = 0;
            while (count < num) {
                if (idxs[++tempIdx]) count++;
            }
        }
        if (c[0] == 'C') {
            idxs[tempIdx] = 0;
            removed.push(tempIdx);
            if (tempIdx == lastIdx) {
                lastIdx--; tempIdx--;
                continue;
            }
            while (true) {
                if (idxs[++tempIdx]) break;
            }
        }
        if (c[0] == 'Z') {
            int idx = removed.top();
            removed.pop();
            idxs[idx] = 1;
            if (idx > lastIdx) lastIdx=idx;
        }
    }
    for (int i=0;i<n;i++){
        if (idxs[i]) answer+='O';
        else answer+='X';
    }
    return answer;
}

ํ .. ์ •ํ™•๋„์—์„œ 3๊ฐœ๊ฐ€ ํ‹€๋ ธ๊ณ , ํšจ์œจ์„ฑ์€ ์ ˆ๋ฐ˜๋ฐ–์— ๋งž์ง€๋ชปํ–ˆ๋‹ค ใ…œใ…œ

์ด ์ฝ”๋“œ์—์„œ ์ •ํ™•๋„๋ฅผ ๊ฐœ์„ ํ•ด๋ดค์ž, ํšจ์œจ์„ฑ์—์„œ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•  ๊ฒƒ ๊ฐ™์•„ ๋‹ค๋ฅธ ํ’€์ด ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ณด์•˜๋‹ค.

 

์ด ๋ธ”๋กœ๊ทธ์˜ ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ–ˆ๋‹ค.

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•„์ด๋””์–ด์ธ๋ฐ, C++์—์„œ <set> ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ–ˆ๋‹ค.

 

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ๋Œ€์‹ ์— set์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•ด๋„ ๋˜๋Š” ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. (์œ„ ๋ธ”๋กœ๊ทธ ๋‚ด์šฉ ๋ฐœ์ทŒ)

1. ์ด์ง„ํŠธ๋ฆฌ ๊ตฌ์กฐ์ด๋‹ค. → ์‚ฝ์ž…/์‚ญ์ œ ์‹œ๊ฐ„ ๋ณต์žก๋„ : O(logN)
2. iterator๋ฅผ ํ†ตํ•œ ์ˆœ์ฐจ์ ‘๊ทผ ๊ฐ€๋Šฅ→ next(), prev()๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ์›์†Œ์˜ ์–‘ ์˜† ํƒ์ƒ‰ ๊ฐ€๋Šฅ
3. set ๋‚ด๋ถ€์˜ ์›์†Œ๋“ค์€ ํ•ญ์ƒ ์ •๋ ฌ๋œ ์ƒํƒœ์ด๋‹ค.

์œ„ ๋‚ด์šฉ์„ ์ดํ•ดํ–ˆ๋‹ค๋ฉด set ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์„ ์–ธ๋งŒ ํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋ณธ ๋ฌธ์ œ์—์„œ ์š”๊ตฌํ•˜๋Š” ํ‘œ ์‹œ์Šคํ…œ์ด ๊ตฌ์ถ•๋จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค! ๊ธฐ๋Šฅ์— ๋”ฐ๋ฅธ ๊ตฌํ˜„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ปค์„œ ์ด๋™: next(set<int>::iterator), prev(set<int>::iterator)
ํ–‰ ์‚ญ์ œ:    set<int>::erase(set<int>::iterator)
ํ–‰ ๋ณต์›:    set<int>::insert(int)
์‹ฌ์ง€์–ด erase()์˜ ๊ฐ™์€ ๊ฒฝ์šฐ, ์›์†Œ ์‚ญ์ œ ํ›„ ํ•ด๋‹น ์›์†Œ์˜ ๋‹ค์Œ ์›์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” iterator๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ๋ณ„ ๋‹ค๋ฅธ ๊ตฌํ˜„์—†์ด ๋ฌธ์ œ์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋งŒ์กฑ์‹œํ‚ด์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์‚ญ์ œํ•œ ์›์†Œ๊ฐ€ ๋งˆ์ง€๋ง‰ ์›์†Œ์—ฌ์„œ iterator๊ฐ€ set<int>::end() ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋  ๊ฒฝ์šฐ์—๋งŒ prev() ๋ฅผ ํ†ตํ•ด ์ด์ „ ์›์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ๋” ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์„ค๋ช…์ด ์ž˜ ์ ํ˜€์žˆ์–ด์„œ, ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ์‰ฌ์› ๋‹ค. 

 

set์„ ์ด์šฉํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

#include <string>
#include <vector>
#include <stack>
#include <set>

using namespace std;

string solution(int n, int k, vector<string> cmd) {
    string answer(n,'X');
    stack<int> removed;
    set<int> table;
    for (int i=0;i<n;i++)
        table.insert(i);
    auto cur = table.find(k); // ํ˜„์žฌ ์œ„์น˜
    
    for(string c: cmd) {
        if (c[0] == 'U' || c[0] == 'D') {
            int num = stoi(c.substr(2));
            if (c[0] == 'U')
                while(num--)
                    cur = prev(cur);
            else
                while(num--)
                    cur = next(cur);
            continue;
        }
        if (c[0] == 'C') { // ์‚ญ์ œ
            removed.push(*cur);
            cur = table.erase(cur);
            if (cur == table.end()) cur = prev(cur);
            continue;
        }
        if (c[0] == 'Z') { // ๋ณต๊ตฌ
            table.insert(removed.top());
            removed.pop();
            continue;
        }
    }
    for(int i:table) answer[i]='O';
    return answer;
}

๊ฒฐ๊ณผ

set์„ ์ด์šฉํ•œ ์ฝ”๋“œ๋กœ 100์ ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋‹ค๋งŒ, ์‹ค์ „์—์„œ ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ๋ฐ›์•˜์„ ๋•Œ set์„ ๋– ์˜ฌ๋ฆด ์ˆ˜ ์—†์—ˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

C++์˜ STL์— ๋Œ€ํ•œ ์ดํ•ด๋„๋ฅผ ๋†’์—ฌ์•ผ๊ฒ ๋‹ค.

๋ฐ˜์‘ํ˜•