정수를 저장하는 큐를 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 여섯 가지이다.
push X: 정수 X를 큐에 넣는 연산이다.
pop: 큐에서 가장 앞에 있는 정수를 빼고, 그 수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
size: 큐에 들어있는 정수의 개수를 출력한다.
empty: 큐가 비어있으면 1, 아니면 0을 출력한다.
front: 큐의 가장 앞에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
back: 큐의 가장 뒤에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.
출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.
15
push 1
push 2
front
back
size
empty
pop
pop
pop
size
empty
pop
push 3
empty
front
1
2
2
0
1
2
-1
0
1
-1
0
3
import sys
class Node:
def __init__(self,data):
self.data = data
self.next = None
class Queue:
def __init__(self):
self.front_node = None
self.rear_node = None
self._size = 0
def push(self,data):
new_node = Node(data)
if not self.front_node:
self.front_node = new_node
if self.rear_node:
self.rear_node.next = new_node
self.rear_node = new_node
self._size += 1
def pop(self):
if self.front_node:
if self.front_node == self.rear_node:
self.rear_node = None
data = self.front_node.data
self.front_node = self.front_node.next
self._size -=1
return data
else:
return -1
def size(self):
return self._size
def empty(self):
return int(not self.front_node)
def front(self):
return self.front_node.data if self.front_node else -1
def back(self):
return self.rear_node.data if self.rear_node else -1
def main():
input = sys.stdin.readline
new_queue = Queue()
for test_case in range(int(input())):
command = input().split()
match command[0]:
case 'push':
new_queue.push(command[1])
case 'pop':
print(new_queue.pop())
case 'size':
print(new_queue.size())
case 'empty':
print(new_queue.empty())
case 'front':
print(new_queue.front())
case 'back':
print(new_queue.back())
if __name__ == '__main__':
main()
큐를 직접 구현해보았다. 파이썬에서는 라이브러리로 잘 되어 있기 때문에 할 필요는 없지만, 큐에 대한 이해도를 높이고 싶었다.
from collections import deque
class Queue:
def __init__(self):
self.queue = deque()
def push(self, data: str) -> None:
self.queue.append(data)
def pop(self) -> str:
return self.queue.popleft() if self.queue else -1
def size(self) -> int:
return len(self.queue)
def empty(self) -> int:
return 0 if self.queue else 1
def front(self) -> str:
return self.queue[0] if self.queue else -1
def back(self) -> str:
return self.queue[-1] if self.queue else -1
입출력 최적화 : print를 사용하는 것 보다는 내부 버퍼링을 이용
타입 힌트 추가: 코드의 가독성과 유지보수성을 높여줌
import sys
from typing import Optional, List
class Node:
def __init__(self, data: str):
self.data: str = data
self.next: Optional['Node'] = None
class Queue:
def __init__(self):
self.front_node: Optional[Node] = None
self.rear_node: Optional[Node] = None
self._size: int = 0
def push(self, data: str) -> None:
new_node = Node(data)
if not self.front_node:
self.front_node = new_node
if self.rear_node:
self.rear_node.next = new_node
self.rear_node = new_node
self._size += 1
def pop(self) -> str:
if self.front_node:
data = self.front_node.data
self.front_node = self.front_node.next
if not self.front_node:
self.rear_node = None
self._size -= 1
return data
return "-1"
def size(self) -> int:
return self._size
def empty(self) -> int:
return 0 if self._size > 0 else 1
def front(self) -> str:
return self.front_node.data if self.front_node else "-1"
def back(self) -> str:
return self.rear_node.data if self.rear_node else "-1"
def main():
input = sys.stdin.readline
new_queue = Queue()
results: List[str] = []
n = int(input())
for _ in range(n):
command = input().strip().split()
if command[0] == 'push':
new_queue.push(command[1])
elif command[0] == 'pop':
results.append(new_queue.pop())
elif command[0] == 'size':
results.append(str(new_queue.size()))
elif command[0] == 'empty':
results.append(str(new_queue.empty()))
elif command[0] == 'front':
results.append(new_queue.front())
elif command[0] == 'back':
results.append(new_queue.back())
print('\n'.join(results))
if __name__ == '__main__':
main()