문제
정수를 저장하는 덱(Deque)를 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 여덟 가지이다.
- push_front X: 정수 X를 덱의 앞에 넣는다.
- push_back X: 정수 X를 덱의 뒤에 넣는다.
- pop_front: 덱의 가장 앞에 있는 수를 빼고, 그 수를 출력한다. 만약, 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
- pop_back: 덱의 가장 뒤에 있는 수를 빼고, 그 수를 출력한다. 만약, 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
- size: 덱에 들어있는 정수의 개수를 출력한다.
- empty: 덱이 비어있으면 1을, 아니면 0을 출력한다.
- front: 덱의 가장 앞에 있는 정수를 출력한다. 만약 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
- back: 덱의 가장 뒤에 있는 정수를 출력한다. 만약 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
입력
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.
출력
출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.
아이디어
사실 python에 이미 내장되어있는 덱을 사용해서 풀 수 있을 것 같지만
공부할 겸 직접 개발해서 풀었다.
덱 구현은 양방향 연결리스트를 활용했다.
제출 코드
import sys
input = sys.stdin.readlines
class Node:
def __init__(self, value):
self.value = value
self.prev = None
self.next = None
class Deque:
def __init__(self):
self.head = None
self.tail = None
self.size = 0
def push_front(self, value):
new_node = Node(value)
if self.head != None:
self.head.prev = new_node
new_node.next = self.head
if self.tail == None:
self.tail = new_node
self.head = new_node
self.size += 1
def push_back(self, value):
new_node = Node(value)
if self.tail != None:
self.tail.next = new_node
new_node.prev = self.tail
if self.head == None:
self.head = new_node
self.tail = new_node
self.size += 1
def pop_front(self):
if self.head == None:
return -1
else:
deleted_value = self.head.value
if self.tail == self.head:
self.head = None
self.tail = None
else:
self.head = self.head.next
self.size -= 1
return deleted_value
def pop_back(self):
if self.tail == None:
return -1
else:
deleted_value = self.tail.value
if self.tail == self.head:
self.head = None
self.tail = None
else:
self.tail = self.tail.prev
self.size -= 1
return deleted_value
def get_size(self):
return self.size
def is_empty(self):
return 1 if self.size == 0 else 0
def get_front(self):
return -1 if self.head == None else self.head.value
def get_back(self):
return -1 if self.tail == None else self.tail.value
def printQueue(self):
current = self.head
print("head : ", self.head.value if self.head else "None")
print("tail : ", self.tail.value if self.tail else "None")
while current:
print(current.value, " <-> ", end="")
current = current.next
print("None")
def solution():
deque = Deque()
command_list = input()[1:]
for command in command_list:
command = command.split()
# print("==================================")
# print(command)
if command[0] == "push_front":
deque.push_front(command[1])
elif command[0] == "push_back":
deque.push_back(command[1])
elif command[0] == "pop_front":
print(deque.pop_front())
elif command[0] == "pop_back":
print(deque.pop_back())
elif command[0] == "size":
print(deque.get_size())
elif command[0] == "empty":
print(deque.is_empty())
elif command[0] == "front":
print(deque.get_front())
elif command[0] == "back":
print(deque.get_back())
# deque.printQueue()
# print("==================================")
solution()
'Study > Algorithms' 카테고리의 다른 글
백준 11866: 요세푸스 문제 0 (Python) - 공식 없이 쉽게 풀이 (0) | 2024.06.04 |
---|---|
백준 11050 이항계수 (Python) (0) | 2024.05.31 |
백준 10816 숫자 카드 2 (Python) (0) | 2024.05.31 |
파이썬으로 알고리즘 풀 때 알아야 할 것들 (0) | 2024.05.31 |
백준 10814: 나이순 정렬 (0) | 2024.05.31 |