나를 기록하다
article thumbnail
Published 2023. 3. 20. 22:07
[백준 10845 파이썬/python] 큐 Algorithm
반응형
시간 제한메모리 제한제출정답맞힌 사람정답 비율
0.5 초 (추가 시간 없음)256 MB98001448443513749.082%

문제

정수를 저장하는 큐를 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

명령은 총 여섯 가지이다.

  • push X: 정수 X를 큐에 넣는 연산이다.
  • pop: 큐에서 가장 앞에 있는 정수를 빼고, 그 수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • size: 큐에 들어있는 정수의 개수를 출력한다.
  • empty: 큐가 비어있으면 1, 아니면 0을 출력한다.
  • front: 큐의 가장 앞에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • back: 큐의 가장 뒤에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.

입력

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.

출력

출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.

예제 입력 1

15
push 1
push 2
front
back
size
empty
pop
pop
pop
size
empty
pop
push 3
empty
front

예제 출력 1

1
2
2
0
1
2
-1
0
1
-1
0
3

풀이

1)

import sys

input = sys.stdin.readline
n = int(input())
queue = [0] * n
begin = 0
end = 0
for _ in range(n):
    cmd, *val = input().split()
    if cmd == 'push':
        num = int(val[0])
        queue[end] = num
        end += 1
    elif cmd == 'front':
        if begin == end:
            print(-1)
        else:
            print(queue[begin])
    elif cmd == 'size':
        print(end-begin)
    elif cmd == 'empty':
        if begin == end:
            print(1)
        else:
            print(0)
    elif cmd == 'pop':
        if begin == end:
            print(-1)
        else:
            print(queue[begin])
            begin += 1
    elif cmd =='back':
        if begin == end:
            print(-1)
        else:
            print(queue[end-1])

이 코드는 리스트를 사용하여 큐 자료 구조를 구현한 파이썬 프로그램입니다. 큐는 선입선출(FIFO) 원칙을 따르는 항목의 모음입니다. 즉, 큐에 가장 먼저 추가된 항목이 가장 먼저 제거됩니다. 코드는 sys.stdin.readline을 사용하여 input() 함수보다 빠르게 입력을 읽습니다. 코드는 다음과 같은 단계를 수행합니다:

  • queue라는 빈 리스트를 생성하고 n개의 원소를 할당합니다. 여기서 n은 사용자가 주는 명령어의 개수입니다.
  • begin과 end라는 두 변수를 초기화하여 큐의 앞과 뒤를 추적합니다.
  • 사용자가 주는 각 명령어에 대해 다른 작업을 수행합니다:
    • 명령어가 'push’이면 정수 값을 큐의 끝에 추가하고 end를 1 증가시킵니다.
    • 명령어가 'front’이면 큐의 앞에 있는 값을 출력하거나 큐가 비어 있으면 -1을 출력합니다.
    • 명령어가 'size’이면 end와 begin의 차이를 출력합니다. 이 값은 큐에 있는 원소의 개수와 같습니다.
    • 명령어가 'empty’이면 begin과 end가 같으면 (즉, 큐에 원소가 없으면) 1을 출력하거나 그렇지 않으면 0을 출력합니다.
    • 명령어가 'pop’이면 큐의 앞에 있는 값을 출력하고 제거하거나 큐가 비어 있으면 -1을 출력합니다. 그리고 begin을 1 증가시킵니다.
    • •명령어가 'back’이면 큐의 뒤에 있는 값을 출력하거나 큐가 비어 있으면 -1을 출력합니다.

2)

import sys

class Queue:
    def __init__(self):
        self.queue = []
    
    def push(self, x):
        self.queue.append(x)
    
    def pop(self):
        if self.empty():
            return -1
        else:
            return self.queue.pop(0)
    
    def size(self):
        return len(self.queue)
    
    def empty(self):
        return 1 if not self.queue else 0
    
    def front(self):
        return self.queue[0] if not self.empty() else -1
    
    def back(self):
        return self.queue[-1] if not self.empty() else -1

n = int(input())
q = Queue()

for _ in range(n):
    command = sys.stdin.readline().split()
    if command[0] == 'push':
        q.push(int(command[1]))
    elif command[0] == 'pop':
        print(q.pop())
    elif command[0] == 'size':
        print(q.size())
    elif command[0] == 'empty':
        print(q.empty())
    elif command[0] == 'front':
        print(q.front())
    elif command[0] == 'back':
        print(q.back())

큐는 먼저 들어온 데이터가 먼저 나가는 자료구조이며, First-In-First-Out(FIFO) 원칙을 따릅니다.

클래스 Queue는 다음과 같은 메소드를 가지고 있습니다.

  • __init__(self): Queue 클래스의 초기화 메소드입니다. 빈 리스트를 생성합니다.
  • push(self, x): 큐의 가장 뒤에 x를 추가합니다.
  • pop(self): 큐에서 가장 앞에 있는 데이터를 삭제하고 반환합니다. 큐가 비어있는 경우 -1을 반환합니다.
  • size(self): 큐의 현재 크기를 반환합니다.
  • empty(self): 큐가 비어있으면 1을, 그렇지 않으면 0을 반환합니다.
  • front(self): 큐의 가장 앞에 있는 데이터를 반환합니다. 큐가 비어있는 경우 -1을 반환합니다.
  • back(self): 큐의 가장 뒤에 있는 데이터를 반환합니다. 큐가 비어있는 경우 -1을 반환합니다.

이후, main 함수에서는 표준 입력을 통해 명령어를 입력받고, 해당 명령어에 따라 Queue 클래스의 메소드를 호출하여 큐를 구현합니다. 예를 들어, 'push 1'을 입력하면 push 메소드가 호출되어 1이 큐에 추가됩니다. 'pop'을 입력하면 pop 메소드가 호출되어 큐에서 가장 앞에 있는 데이터가 삭제되고 반환됩니다. 이와 같은 방식으로 사용자의 명령어에 따라 큐를 조작합니다.


Uploaded by N2T

반응형
profile

나를 기록하다

@prao

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...