본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 10866 덱

by 까망 하르방 2022. 2. 25.
반응형

Approach

출처https://www.acmicpc.net/problem/10866

 

deque를 구현하는 문제이다.

덱은 stack, queue와 마찬가지로 자료구조 공부하는데 있어서

자주 나오는 자료구조이다.

 

앞/뒤로 push/pop이 되는 구조로

C++에서는 STL로 제공되기 때문에

비교적으로 쉽게 해결할 수 있는 문제이다.

* 앞뒤 방향과 비어있는 상태에 따른 출력처리에 유의

 

📌 [스택] Stack 이란?

 

[스택] Stack 이란?

Stack 이란? 스택 (Stack) 특징을 가장 잘 나타내는 표현은 후입선출(Last In First Out, LIFO) 이다. ▶ 스택(Stack)은 삽입(push)과 삭제(pop)이 한쪽 끝에서만 일어나는 구조 가장 상단에 위치한 원소를 가리.

zoosso.tistory.com

 

📌 [큐] Queue란?

 

[큐] Queue란?

Queue란? 선입선출(First In First Out, FIFO)의 자료 구조 ▶ 큐(Queue)는 한쪽에서 삽입(Push, Enqueue) 하며, 다른 한쪽에서 빠져나오는(Pop, Dequeue) 구조 두 지점을 와 로 표현한다. (Front, Rear) ▶ C++..

zoosso.tistory.com

 

C++

#include <iostream>
#include <deque>
#include <string>
using namespace std;

deque<int> dQ;
string str;
int N, val;

int main() 
{
	// freopen("input.txt", "r", stdin);

	cin >> N;
	while (N--) 
	{
		cin >> str;
		if (str == "push_front")
		{
			cin >> val;
			dQ.push_front(val);
		}

		else if (str == "push_back")
		{
			cin >> val;
			dQ.push_back(val);
		}

		else if (str == "pop_front")
		{
			if (dQ.empty())
			{
				printf("%d\n", -1);
			}
			else 
			{
				printf("%d\n", dQ.front());
				dQ.pop_front();
			}
		}

		else if (str == "pop_back") 
		{
			if (dQ.empty())
			{
				printf("%d\n", -1);
			}
			else
			{
				printf("%d\n", dQ.back());
				dQ.pop_back();
			}
		}

		else if (str == "size")
		{
			printf("%d\n", dQ.size());
		}

		else if (str == "empty")
		{
			printf("%d\n", dQ.empty() ? 1 : 0);
		}

		else if (str == "front")
		{
			printf("%d\n", dQ.empty()  ? -1 : dQ.front());
		}

		else if (str == "back")
		{
			printf("%d\n", dQ.empty() ? -1 : dQ.back());
		}
	}
}

 

 

import java.util.Scanner;

class Node {
	int data;
	Node llink;
	Node rlink;

	public Node(int data) {
		this.data = data;
		this.llink = null;
		this.rlink = null;
	}
}

class Deque {
	Node front;
	Node rear;

	public Deque() {
		this.front = null;
		this.rear = null;
	}

	public void push_front(int data) {
		Node node = new Node(data);
		if (is_empty() == 1) {
			front = node;
			rear = node;
		}
		else {
			front.llink = node;
			node.rlink = front;
			front = node;
		}
	}
	public void push_rear(int data) {
		Node node = new Node(data);
		if (is_empty() == 1) {
			front = node;
			rear = node;
		}
		else {
			rear.rlink = node;
			node.llink = rear;
			rear = node;
		}
	}
	public int pop_front() {
		if (front == null)
			return -1;
		int result = front.data;
		front = front.rlink;
		if (front != null)
			front.llink = null; // 연결 끊기  
		else // 삭제해서 비어버린 경우이므로 rear도 null
			rear = null;

		return result;
	}
	public int pop_rear() {
		if (rear == null)
			return -1;
		int result = rear.data;
		rear = rear.llink;
		if (rear != null)
			rear.rlink = null; // 연결 끊기
		else { // 삭제해서 비어버린 경우이므로 front도 null
			front = null;
		}

		return result;
	}
	public int deque_size() {
		int count = 0;
		if (is_empty() == 1)
			return 0;
		Node search = front;
		while (true) {
			if (search == null)
				break;
			search = search.rlink;
			count++;
		}
		return count;
	}

	public int is_empty() {
		if (front == null && rear == null)
			return 1;
		return 0;
	}

	public int front_value() {
		if (front == null) {
			return -1;
		}
		return front.data;
	}

	public int rear_value() {
		if (rear == null) {
			return -1;
		}
		return rear.data;
	}
}


public class Main {

	public static void main(String[] args) {
		Deque DQ = new Deque();
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int idx = 0;
		int result[] = new int[n];
		sc.nextLine();
		for (int i = 0; i < n; i++) {
			String str = sc.nextLine();
			String[]value = str.split(" ");
			
			// StringTokenizer과의 차이는 공백도 하나의 인자로 칠 수 있는데
			// 여기서는 공백으로 구분하기 의미가 모호 (ex. ',' 로 구분할 때)
			if (value[0].equals("push_back")) {
				int number = Integer.parseInt(value[1]);
				DQ.push_rear(number);
			}
			else if (value[0].equals("push_front")) {
				int number = Integer.parseInt(value[1]);
				DQ.push_front(number);
			}
			else if (value[0].equals("pop_front")) {
				result[idx++] = DQ.pop_front();
			}
			else if (value[0].equals("pop_back")) {
				result[idx++] = DQ.pop_rear();
			}
			else if (value[0].equals("front")) {
				result[idx++] = DQ.front_value();
			}
			else if (value[0].equals("back")) {
				result[idx++] = DQ.rear_value();
			}
			else if (value[0].equals("size")) {
				result[idx++] = DQ.deque_size();
			}
			else if (value[0].equals("empty")) {
				result[idx++] = DQ.is_empty();
			}
		}

		for (int i = 0; i < idx; i++) {
			System.out.println(result[i]);
		}

	}
}
반응형

'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글

[BOJ] 백준 5622 다이얼  (0) 2022.03.02
[BOJ] 백준 4948 베르트랑 공준  (0) 2022.02.28
[BOJ] 백준 4673 셀프 넘버  (0) 2022.02.25
[BOJ] 백준 11441 합 구하기  (0) 2022.02.23
[BOJ] 백준 11653 소인수분해  (0) 2022.02.22

댓글