와이유스토리

[구현] 백준 23294 웹 브라우저1, 23300 웹 브라우저2 C++ 본문

코딩테스트/구현|기타

[구현] 백준 23294 웹 브라우저1, 23300 웹 브라우저2 C++

유(YOO) 2023. 9. 15. 19:31

 

https://www.acmicpc.net/problem/23294

 

23294번: 웹 브라우저 1

첫째 줄에 접속할 수 있는 웹페이지의 종류의 수 N, 사용자가 수행하는 작업의 개수 Q 와 최대 캐시 용량 C 이 순서대로 주어진다.(1 ≤ N, Q ≤ 2,000, 1 ≤ C ≤ 200,000) 둘째 줄에는 N개의 정수 CAPi

www.acmicpc.net

https://www.acmicpc.net/problem/23300

 

23300번: 웹 브라우저 2

첫째 줄에 접속할 수 있는 웹페이지의 종류의 수 N, 사용자가 수행하는 작업의 개수 Q 가 각각 주어진다.(1 ≤ N, Q ≤ 2,000) 둘째 줄부터는 Q개의 작업이 주어지며, 각 작업이 의미하는 바는 다음

www.acmicpc.net

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    int n, q, c;
    cin >> n >> q >> c;

    vector<int> cap(n+1, 0);
    for(int i=1; i<=n; i++) cin >> cap[i];

    deque<int> back, front;

    int page = -1;
    int cache = 0;
    char ch;
    for(int i=0; i<q; i++) {
        cin >> ch;

        if (ch == 'A') {
            for(auto f : front) cache -= cap[f];
            front.clear();
            if (page != -1) back.push_back(page);

            cin >> page;
            cache += cap[page];

            while (cache > c) {
                cache -= cap[back.front()];
                back.pop_front();
            }
        }
        else if (ch == 'B') {
            if (back.size() > 0) {
                front.push_back(page);
                page = back.back();
                back.pop_back();
            }
        }
        else if (ch == 'F') {
            if (front.size() > 0) {
                back.push_back(page);
                page = front.back();
                front.pop_back();
            }
        }
        else {
            int cnt = 0;
            int size = back.size();
            for(int j=0; j<size; j++) {
                int temp = back.front();
                back.pop_front();
                if (j == 0) back.push_back(temp);
                else if (temp != back.back()) back.push_back(temp);
                else cnt += cap[temp];
            }
            cache -= cnt;
        }
    }

    cout << page << "\n";
    
    if (back.size() == 0) cout << -1;
    else {
        for(int i=back.size()-1; i>=0; i--) cout << back[i] << " ";
    }
    cout << "\n";

    if (front.size() == 0) cout << -1;
    else {
        for(int i=front.size()-1; i>=0; i--) cout << front[i] << " ";
    }
    cout << "\n";

    return 0;
}
#include <iostream>
#include <queue>

using namespace std;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    int n, q;
    cin >> n >> q;

    deque<int> back, front;

    int page = -1;
    char c;
    for(int i=0; i<q; i++) {
        cin >> c;

        if (c == 'A') {
            front.clear();
            if (page != -1) back.push_back(page);
            cin >> page;
        }
        else if (c == 'B') {
            if (back.size() > 0) {
                front.push_back(page);
                page = back.back();
                back.pop_back();
            }
        }
        else if (c == 'F') {
            if (front.size() > 0) {
                back.push_back(page);
                page = front.back();
                front.pop_back();
            }
        }
        else {
            int size = back.size();
            for(int i=0; i<size; i++) {
                int temp = back.front();
                back.pop_front();
                if (i == 0) back.push_back(temp);
                else if (temp != back.back()) back.push_back(temp);
            }
        }
    }

    cout << page << "\n";
    
    if (back.size() == 0) cout << -1;
    else {
        for(int i=back.size()-1; i>=0; i--) cout << back[i] << " ";
    }
    cout << "\n";

    if (front.size() == 0) cout << -1;
    else {
        for(int i=front.size()-1; i>=0; i--) cout << front[i] << " ";
    }
    cout << "\n";

    return 0;
}
Comments