상세 컨텐츠

본문 제목

< 백준 BaekJoon : 28279번 덱 2> C++

C++/Baekjoon

by J2on 2024. 1. 23. 20:03

본문

<< 문제>>

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

 

28279번: 덱 2

첫째 줄에 명령의 수 N이 주어진다. (1 ≤ N ≤ 1,000,000) 둘째 줄부터 N개 줄에 명령이 하나씩 주어진다. 출력을 요구하는 명령은 하나 이상 주어진다.

www.acmicpc.net

 

 

간단하게 Deck을 구현하는 문제

 

입력이 1,000,000개 주어진다고 해서 앞 뒤 여유 1,000,000개 씩 넣어 2,000,001개 리스트로 구성했습니다. 

 

시작점을 1,000,000 으로 두어 head와 last가 앞뒤로 이동하면서 동작하도록 구현했습니다. 

 

<< 코드 >>

#include <iostream>
using namespace std;

class myDeck {
private:
  int list[2000001];
  int head = 1000000;
  int last = 1000000;

public:
  void pushFront(int num) {
    head--;
    list[head] = num;
  }

  void pushBack(int num) {
    list[last] = num;
    last++;
  }

  int popFront() {
    if (empty())
      return -1;

    int result = list[head];
    head++;
    return result;
  }

  int popBack() {
    if (empty())
      return -1;

    int result = list[last - 1];
    last--;
    return result;
  }

  int size() { return last - head; }

  bool empty() {
    if (head == last) {
      return true;
    } else {
      return false;
    }
  }

  int front() {
    if (empty())
      return -1;

    return list[head];
  }

  int back() {
    if (empty())
      return -1;

    return list[last - 1];
  }
};

void deckAction(myDeck &d, int input) {

  switch (input) {
  int temp;
  case 1:
    cin >> temp;
    d.pushFront(temp);
    break;
  case 2:
    cin >> temp;
    d.pushBack(temp);
    break;
  case 3:
    cout << d.popFront() << '\n';
    break;
  case 4:
    cout << d.popBack() << '\n';
    break;
  case 5:
    cout << d.size() << '\n';
    break;
  case 6:
    cout << d.empty() << '\n';
    break;
  case 7:
    cout << d.front() << '\n';
    break;
  case 8:
    cout << d.back() << '\n';
    break;
  }
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);

  int n;
  cin >> n;

  myDeck d;
  
  int input;
  for (int i = 0; i < n; i++) {
    cin >> input;
    deckAction(d, input);
  }
}

 

 

관련글 더보기

댓글 영역