STL 시퀸스 컨테이너 to 컨테이너 어답터(백준)

2 minute read

Published:

백준 스택2

백준 큐2

타 container 자료구조 구현 문제는 담에 하도록하고… 다 구현 되어있으니. stl container를 조사하면서 sequence container의 기능을 제한시켜 continer adapter를 구현한다하여, 백준문제를 해결할겸 직접 해보기로 하였다.


스택 구현

코드

#include <vector>
#include <iostream>
#include <sstream>

int main(){
  int size;
  std::cin >> size;

  std::vector<int> v(0);
  std::ostringstream oss;

  for (int i = 0; i< size ; i++){
    int command;
    std::cin >> command;
    if(command == 1){
      int insert;
      std::cin >> insert;
      v.push_back(insert);
    } else if(command == 2){
      if(v.size() <= 0){
        oss << -1<< '\n';
      }
      else{
        oss << v.at(v.size()-1)<<'\n';
        v.pop_back();
      }
    } else if(command == 3) {
      oss << v.size()<< '\n';
    } else if (command == 4) {
      if(v.size() == 0)
      oss << 1<< '\n';
      else
      oss << 0<< '\n';
    } else {
      if(v.size() <= 0)
      oss << -1<< '\n';
      else
      oss << v.at(v.size()-1)<<'\n';
    }
  }
  std::cout<< oss.str() << std::flush;
  return 0;

}

양 끝단에서의 삽입, 삭제가 가장 빠른 벡터를 이용하였다. 구현자체가 어렵지 않아 큰 문제는 없었다. 왜 벡터로 구현하지 같은 의문점은 stl container 관련해 정리하며 그 게시물에 정리해 두었다.

정리글

큐 구현

구현

#include <deque>
#include <iostream>
#include <sstream>
#include <string>

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

  std::ostringstream alls;
  int command;
  std::cin >> command;
  std::cin.ignore();
  std::deque<int> q(0);




  for(int i = 0; i< command; i++){
    std::string onelinecommand;
    std::getline(std::cin, onelinecommand);
    std::stringstream onelinecommandstream(onelinecommand);
    std::string first;
    std::getline(onelinecommandstream, first, ' ');
    std::string second;

    if (first == "push"){
      std::getline(onelinecommandstream,second);
      q.push_front(std::stoi(second));
    } else if (first == "pop") { 
      if(q.size() <= 0){
        alls <<"-1\n";
        continue;
      }
      alls << q.back() << '\n';
      q.pop_back();
    } else if (first == "size") {
      alls << q.size() << '\n';
    } else if (first == "front") {
      if(q.size() == 0)
      alls << "-1\n";
      else
      alls << q.back() << '\n';
    } else if (first == "empty") {
      if(q.size() == 0)
      alls << "1\n";
      else
      alls << "0\n";
    } else if (first == "back") {
      if(q.size() == 0)
      alls << "-1\n";
      else
      alls << q.front() << '\n';
    }
  }
  std::cout << alls.str() << std::flush;

}

큐 역시 양 끝단으로만 접근한다 생각하여 최초는 vector로 구현하였다. 그러나 vector가 우측 끝단의 삽입만 허용하는 걸 몰랐었다. 그래서 하나하나 다시 deque로 바꿨다… 구현시에 내가 활용하는 라이브러리가 특정 기능을 지원하는지 여부를 살피는 것도 중요한것 같다.

백준에서 runtimeerror 발생 이유를 살피지 않아서 오래 걸렸다… 다음에는 꼭 살펴보자.

각 컨테이너별 지원하는 연산 목록

다른 사람 코드 참고하기

나중에 추가…