일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 다이나믹프로그래밍
- SQL
- 백준알고리즘
- 이진탐색
- 프로그래머스연습문제
- 그리디알고리즘
- 프로그래머스sql
- 자료구조
- Image Classification
- 논문구현
- 프로그래머스
- C
- 사칙연산
- 소수판정
- 백준
- 그리디
- 논문리뷰
- 브루트포스알고리즘
- 문자열
- 구현
- 해시를사용한집합과맵
- 정수론
- 큐
- C언어
- 정렬
- MySQL
- 이분탐색
- C++
- 수학
- 프로그래머스코딩테스트
- Today
- Total
초보 개발자의 이야기, 릿허브
[C++] 백준 10866번 덱 본문
1. 문제이해
위와 같은 8가지의 명령어를 수행하는 덱을 구현하는 것이 목표이다.
2. 문제풀이
위 8가지의 명령어를 수행하는 덱을 구현하면 되는 간단한 문제이다.
덱(deque)이란, double-ended queue의 약자로, 양쪽 끝에서 삽입과 삭제가 모두 가능한 자료구조이다.
두 개의 포인터를 사용하여, 양쪽에서 삭제와 삽입을 발생 시킬 수 있으며,
큐와 스택을 합친 구조로도 볼 수 있다.
덱의 구조를 그림으로 보면 다음과 같다.
위 구조에서 볼 수 있듯이, 덱은 양쪽 끝(front, rear/back)에서 삽입과 삭제가 가능하다.
덱 또한 큐, 스택과 마찬가지로 C++에 구현이 되어있다. (<deque>)
덱의 기본적인 함수들은 다음과 같다.
(문제에서 정의된 8가지 명령어들)
1. deque <데이터타입> 이름; 형태로 선언해준다.
ex) deque <int> dq;
2. dq.push_front(element);
: 덱의 앞부분에 element(원소)를 추가한다.
3. dq.push_back(element);
: 덱의 뒷부분에 element(원소)를 추가한다.
4. dq.pop_front();
: 덱의 맨 앞의 원소를 삭제한다.
5. dq.pop_back();
: 덱의 맨 뒤의 원소를 삭제한다.
6. dq.size();
: 덱의 사이즈(원소의 개수)를 반환한다.
7. dq.empty();
: 덱이 비어있는지를 확인한다.
: 덱이 비어있다면 1(true), 아니라면 0(false)을 반환한다.
8. dq.front();
: 덱의 맨 앞의 원소를 반환한다.
9. dq.back();
: 덱의 맨 뒤의 원소를 반환한다.
3. 소스코드
#include <iostream>
#include <deque> // 덱 헤더파일 추가
using namespace std;
int main() {
deque<int> dq;
int N; // 명령어의 개수
string command; // 명령어
int front_num; // 덱 앞에 들어갈 정수
int back_num; // 덱 뒤에 들어갈 정수
cin >> N;
for (int i = 0; i < N; i++) {
cin >> command;
// 1. push_front
if (command == "push_front") {
cin >> front_num;
dq.push_front(front_num);
}
// 2. push_back
else if (command == "push_back") {
cin >> back_num;
dq.push_back(back_num);
}
// 3. pop_front
else if (command == "pop_front") {
if (dq.empty() == 1) { // 덱이 비어있다면, -1 출력
cout << "-1" << endl;
}
else {
cout << dq.front() << endl; // 앞에서 뺄 원소를 먼저 출력
dq.pop_front(); // 이후에 pop(삭제)
}
}
// 4. pop_back
else if (command == "pop_back") {
if (dq.empty() == 1) { // 덱이 비어있다면, -1 출력
cout << "-1" << endl;
}
else {
cout << dq.back() << endl; // 뒤에서 뺄 원소를 먼저 출력
dq.pop_back(); // 이후에 pop(삭제)
}
}
// 5. size
else if (command == "size") {
cout << dq.size() << endl;
}
// 6. empty
else if (command == "empty") {
cout << dq.empty() << endl;
}
// 7. front
else if (command == "front") {
if (dq.empty() == 1) { // 덱이 비어있다면, -1 출력
cout << "-1" << endl;
}
else {
cout << dq.front() << endl;
}
}
// 8. back
else if (command == "back") {
if (dq.empty() == 1) { // 덱이 비어있다면, -1 출력
cout << "-1" << endl;
}
else {
cout << dq.back() << endl;
}
}
}
return 0;
}
명령어의 개수(N)를 입력받은 후, N만큼 for문을 반복한다.
for문 안에는 8가지 덱의 함수들이 구현이 되어있으며,
명령어(command)가 무엇이냐에 따라 다른 작업을 수행한다.
1. push_front, 2. push_back의 경우, 원소를 하나 더 입력받아 해당 원소를 각각 덱의 앞, 뒤에 삽입했다.
3. pop_front, 4. pop_back의 경우, 덱이 비어있으면 -1을 반환,
그렇지 않으면 각각 맨 앞, 뒤의 원소를 반환 후, pop해주었다.
5. size는 덱의 사이즈를 바로 출력해주었고,
6. empty는 덱이 비어있으면 1, 아니면 0을 출력하도록 했다.
(자동적으로 비어있다면 1, 아니면 0을 출력한다.)
7. front, 8. back 의 경우에도, 큐가 비어있으면 -1을 출력,
그렇지 않으면 각각의 값을 출력하도록 구현했다.
오늘은 자료구조의 하나인 덱을 구현해보는 연습을 했다.
덱은 사실 처음 구현해보는 건데, 큐나 스택과 거의 유사해서
구현하는데 크게 어렵지 않아서 다행이었다. 😊
'코딩테스트 > 📗 백준 (BOJ)' 카테고리의 다른 글
[C++] 백준 9012번 괄호 (0) | 2021.09.15 |
---|---|
[C++] 백준 1057번 토너먼트 (0) | 2021.09.13 |
[C++] 백준 9095번 1, 2, 3 더하기 (0) | 2021.09.11 |
[C++] 백준 12845번 모두의 마블 (0) | 2021.09.09 |
[C++] 백준 1003번 피보나치 함수 (0) | 2021.09.08 |