- 문제 출처 : https://www.acmicpc.net/problem/28279
1. 생각
이번에는 deque (덱) 이라는 자료구조를 가지고 왔다.
queue와 굉장히 유사하지만, pop을 front에서만 할 수 있던 queue와 다르게
pop_front(), pop_back(), push_front(), push_back() 과 같이 앞 뒤 모두 데이터의 입출력이 되는 구조이다.
이 문제는 queue와 stack을 처음 시작할 때처럼 기본 기능을 명령어를 통해 받는 문제이다.
deque에 대해 알아보는 내용을 한번 쭉 살펴보도록 하겠다.
2. 난관 & 해결 방법
#include <iostream>
#include <deque>
역시 deque도 include 해주고 시작한다.
std::deque <int> dq;
int n, com, input;
std::cin.tie(NULL);
std::ios::sync_with_stdio(false);
deque의 초기화 방식도 다른 자료구조와 동일하다.
std::deque <자료형> 이름; 으로 선언하고 시작한다.
이번 과제도 일반 cin으로만 받으면 시간초과가 나와서 tie와 sync_with_stdio를 이용해 속도를 빠르게 만들었다.
for (int i = 0; i < n; i ++){
std::cin >> com;
switch (com) {
case 1:
std::cin >> input;
dq.push_front(input);
break ;
case 2:
.
.
. (중략)
.
.
case 8:
if (dq.empty()){
std::cout << "-1\n";
break ;
}
std::cout << dq.back() << "\n";
break ;
}
}
if - else if 를 잔뜩 쓰려다가, switch - case 문을 거의 써보지 않아서 한번 써봤다.
if문이 3개 이상이 될 때부터는 switch-case문이 더욱 효율이 좋다고 한다.
8가지의 명령어가 있기 때문에 하나하나 다 deque의 함수들을 이용하여 만들어줬고,
기존 queue와 동일하지만 _front, _back 이 pop과 push에 추가되어 활용성이 더 크게 만들어져있다.
3. 코드 및 결론
[ 전체 코드 ]
#include <iostream>
#include <deque>
int main(void){
std::deque <int> dq;
int n, com, input;
std::cin.tie(NULL);
std::ios::sync_with_stdio(false);
std::cin >> n;
for (int i = 0; i < n; i ++){
std::cin >> com;
switch (com) {
case 1:
std::cin >> input;
dq.push_front(input);
break ;
case 2:
std::cin >> input;
dq.push_back(input);
break ;
case 3:
if (dq.empty()){
std::cout << "-1\n";
break ;
}
std::cout << dq.front() << "\n";
dq.pop_front();
break ;
case 4:
if (dq.empty()){
std::cout << "-1\n";
break ;
}
std::cout << dq.back() << "\n";
dq.pop_back();
break ;
case 5:
std::cout << dq.size() << "\n";
break ;
case 6:
if (dq.empty())
std::cout << "1\n";
else
std::cout << "0\n";
break ;
case 7:
if (dq.empty()){
std::cout << "-1\n";
break ;
}
std::cout << dq.front() << "\n";
break ;
case 8:
if (dq.empty()){
std::cout << "-1\n";
break ;
}
std::cout << dq.back() << "\n";
break ;
}
}
}
[ 결론 ]
deque 라는 자료구조에 대해서 알아보았다.
stack 과 queue의 기능 (FIFO, LIFO)을 모두 사용 가능한 구조이며,
양 끝에서 삽입 및 삭제가 가능하다는 장점을 가지고 있지만,
그만큼 메모리 사용량이 크다는 단점도 있다고 한다.
상황에 맞게 자료구조를 쓸 수 있는 능력을 길러보자.
'프로그래밍 > Algorithm' 카테고리의 다른 글
[BOJ] 백준 24511번: queuestack (C++) (0) | 2025.04.11 |
---|---|
[BOJ] 백준 2346번: 풍선 터뜨리기 (C++) (0) | 2025.04.10 |
[BOJ] 백준 11866번: 요세푸스 문제 0 (C++) (1) | 2025.04.08 |
[BOJ] 백준 2164번: 카드 2 (C++) (0) | 2025.04.07 |
[BOJ] 백준 18258번: 큐 2 (C++) (0) | 2025.04.07 |