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

[BOJ] 백준 10845 큐

by 까망 하르방 2021. 7. 22.
반응형

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

Approach

Queue를 구현하는 문제이다.

 

[큐] Queue란?

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

zoosso.tistory.com

- push X: 정수 X를 큐에 넣는 연산이다.

- pop: 큐에서 가장 앞에 있는 정수를 빼고, 그 수 출력.

           만약 큐에 들어있는 정수가 없는 경우 -1 출력.

- size: 큐에 들어있는 정수 개수 출력.

- empty: 큐가 비어있으면 1, 아니면 0 출력.

- front: 큐의 가장 앞에 있는 정수 출력.

            만약 큐에 들어있는 정수가 없는 경우, -1 출력.

- back: 큐의 가장 뒤에 있는 정수를 출력.

            만약 큐에 들어있는 정수가 없는 경우, -1 출력.

 

덱(deque)을 사용해서 풀 수 있는 문제이지만

큐(Queue)를 사용하여 풀었습니다.

▶ [C++] [STL] Queue 

 

[C++] [STL] Queue

Queue 기본 연산 - FIFO 구조 (First In First Out) - push(element) : 큐 (뒤에) 원소 추가 - pop() : 큐에 (앞쪽에) 있는 원소 삭제 - front() : 큐 제일 앞에 있는 원소 반환 - back() : 큐 제일 뒤에 있는..

zoosso.tistory.com

 

덱deque의 경우에는 back 명령어로 쉽게 처리할 수 있다.

제출 코드에서는 가장 뒤에 있는 원소들을 전부 꺼내서 다시 큐에 넣어준다.

이렇게 하면 가장 뒤에 있던 원소가 가장 앞에 위치하게 되면서 그 값을 출력.

출력후에는 원상태로 처리하기 위해 가장 앞에 있는 원소를 다시 push 하여 가장 뒤에 있게 해준다.

원형 큐 형태와 유사하다고 보면된다.

 

▶ [큐] 원형 큐 (Circular Queue) 

 

[큐] 원형 큐 (Circular Queue)

원형 큐 (Circular Queue) 기본적인 Queue 구조는 push와 pop을 반복하다보면 Index (Rear)는 오른쪽으로 이동하게 된다. ▶ [큐] Queue란? [큐] Queue란? Queue란? 선입선출(First In First Out, FIFO)의 자료..

zoosso.tistory.com


#include <iostream>
#include <string>
#include <queue>

using namespace std;

int main(void)
{
	// freopen("input.txt", "r", stdin);
	int N, val;
	scanf("%d", &N);
	queue<int> que;

	for (int i = 0; i < N; i++)
	{

		string cmd;
		cin >> cmd;

		if (cmd == "push")
		{
			scanf("%d", &val);
			que.push(val);
		}
		else if (cmd == "pop")
		{
			if (!que.empty())
			{
				printf("%d\n", que.front());
				que.pop();
			}
			else
			{
				printf("-1\n");
			}
		}

		else if (cmd == "size")
		{
			printf("%d\n", que.size());
		}
		else if (cmd == "empty")
		{
			printf("%d\n", que.empty());
		}
		else if (cmd == "front")
		{
			if (!que.empty())
			{
				printf("%d\n", que.front());
			}
			else
			{
				printf("-1\n");
			}
		}
		else if (cmd == "back")
		{
			if (!que.empty())
			{
				int cnt = que.size();
				// 마지막 원소를 가장 앞쪽으로 조절
				for (int j = 0; j < cnt - 1; j++)
				{
					val = que.front();
					que.pop();
					que.push(val);
				}
				// 가장 앞으로 온 원소를 다시 Queue에 넣어 원래 상태로 복원
				val = que.front();
				que.pop();
				que.push(val);
				printf("%d\n", val);
			}
			else
			{
				printf("-1\n");
			}
		}
	}
}

 

Java

import java.util.Scanner;

class Queue {
	int front, rear;
	int[] queue;
	
	public Queue(int size) {
		front = 0;
		rear = 0;
		queue = new int[size];
	}

	public void push(int value) {
		queue[rear++] = value;
	}

	public int pop() {
		int result = -1;
		if(front == rear){
			return result;
		}else{
			result = queue[front++];
		}
		return result;
	}
	public int queue_size(){
		return (rear-front);
	}
	public int empty(){
		int result = 0;
		if(front == rear){
			result = 1;
		}
		return result;
	}
	public int front(){
		int result = -1;
		if(this.front == rear){
			return result;
		}else{
			result = queue[front];
		}
		return result;
	}
	public int back(){
		int result = -1;
		if(this.rear == front){
			return result;
		}else{
			result = queue[rear-1];
		}
		return result;
	}
	public void print_queue(){
		for(int i=front; i<rear; i++){
			System.out.println(queue[i]);
		}
	}
}
public class Main {
	public static void main(String[] args) {
		Queue Q = new Queue(10000);
		Queue result = new Queue(10000);
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		sc.nextLine();
		for(int i=0; i<n; i++){
			String str = sc.nextLine();
			String []value = str.split(" "); 
			// StringTokenizer과의 차이는 공백도 하나의 인자로 칠 수 있는데
			// 여기서는 공백으로 구분하기 의미가 모호 (ex. ',' 로 구분할 때 )
			if(value[0].equals("push")){
				int number = Integer.parseInt(value[1]);
				Q.push(number);
			}
			else if(value[0].equals("pop")){
				result.push(Q.pop());
			}
			else if(value[0].equals("front")){
				result.push(Q.front());
			}
			else if(value[0].equals("back")){
				result.push(Q.back());
			}
			else if(value[0].equals("size")){
				result.push(Q.queue_size());
			}
			else if(value[0].equals("empty")){
				result.push(Q.empty());
			}
		}
		result.print_queue();


	}
}
반응형

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

[BOJ] 백준 10448 유레카 이론  (0) 2021.07.23
[BOJ] 백준 18258 큐 2  (0) 2021.07.22
[BOJ] 백준 10828 스택  (0) 2021.07.22
[BOJ] 백준 2869 달팽이는 올라가고 싶다.  (0) 2021.07.21
[BOJ] 백준 10773 제로  (0) 2021.07.21

댓글