알고리즘/문제 풀이

백준 23300 - 웹 브라우저 2 (C++)

qqlzzb 2024. 3. 21. 11:35

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

 

23300번: 웹 브라우저 2

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

www.acmicpc.net

 

풀이

덱을 이용해서 풀이하는 구현 문제이다.

문제 설명대로 차근차근 코드를 작성하면 해결할 수 있다.

뒤로 가기, 앞으로 가기 공간을 구현할 때 스택 대신 덱을 사용했는데, 압축 실행시 인덱스로 접근하고 싶었기 때문이다.

그리고 압축 실행시, 뒤로 가기 공간이 비어있으면 out of bounds 오류가 발생하므로, 먼저 비어있는지부터 확인해야 한다.

 

코드

#include <iostream>
#include <deque>

using namespace std;

deque<int> Backstack;
deque<int> Frontstack;
int curP;

void Back() {
    if (Backstack.empty()) return;
    Frontstack.push_front(curP);
    curP = Backstack.front();
    Backstack.pop_front();
}

void Front() {
    if (Frontstack.empty()) return;
    Backstack.push_front(curP);
    curP = Frontstack.front();
    Frontstack.pop_front();
}

void Access(int page) {
    if (!Frontstack.empty()) Frontstack.clear();
    if (curP != 0) {
        Backstack.push_front(curP);
    }
    curP = page;
}

void Compress() {
    if (Backstack.empty()) return;
    int idx = 0;
    while (1) {
        if (idx + 1 == Backstack.size()) break;
        if (Backstack[idx] == Backstack[idx + 1]) {
            Backstack.erase(Backstack.begin() + idx + 1);
        } else idx++;
    }

}

int main() {
    int N, M;
    cin >> N >> M;
    for (int i = 0; i < M; i++) {
        char C;
        cin >> C;
        if (C == 'B') Back();
        else if (C == 'F') Front();
        else if (C == 'A') {
            int p;
            cin >> p;
            Access(p);
        } else Compress();
    }
    cout << curP << '\n';
    if (Backstack.empty()) cout << "-1\n";
    else {
        for (int i = 0; i < Backstack.size(); i++) {
            cout << Backstack[i] << " ";
        }
        cout << '\n';
    }
    if (Frontstack.empty()) cout << "-1\n";
    else {
        for (int i = 0; i < Frontstack.size(); i++) {
            cout << Frontstack[i] << " ";
        }
    }
}

'알고리즘 > 문제 풀이' 카테고리의 다른 글

백준 1283 - 단축키 지정 (C++)  (1) 2024.03.29
백준 14226 - 이모티콘 (C++)  (0) 2024.03.22
백준 2470 - 두 용액 (C++)  (0) 2024.03.19
누적 합  (0) 2024.03.11
백준 2343 - 기타 레슨(C++)  (0) 2023.12.08