문제

[BaekJoon] 18258 큐 2


풀이

파이썬에선 deque()를 이용해서 큐를 구현하면 되는데, deque()를 사용하지 않고 list를 사용해 풀면서 del을 사용해봤지만 시간초과가 났다. 아마도 pop()의 시간 복잡도 O(1) 반해 del의 시간 복잡도가 O(N)이라 초과되지 않았을까 싶다.

그래서 pop(0)을 썼는데..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import sys
n = int(sys.stdin.readline())

queue = []
for _ in range(n):
    operate = sys.stdin.readline().split()

    if operate[0] == 'push':
        queue.append(operate[1])
    elif operate[0] == 'pop':
        if len(queue) == 0:
            print(-1)
        else:
            print(queue.pop(0))
    elif operate[0] == 'size':
        print(len(queue))
    elif operate[0] == 'empty':
        if len(queue) == 0:
            print(1)
        else: 
            print(0)
    elif operate[0] == 'front':
        if len(queue) == 0:
            print(-1)
        else:
            print(queue[0])
    elif operate[0] == 'back':
        if len(queue) == 0:
            print(-1)
        else:
            print(queue[-1])

코드는 문제없이 잘 동작하지만 결과는 시간초과 ㅎ..

그래서 그냥 deque() 사용해서 작성했다. 정답!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import sys
from collections import deque

n = int(sys.stdin.readline())

queue = deque()
for _ in range(n):
    operation = sys.stdin.readline().split()

    if operation[0] == 'push':
        queue.append(operation[1])
    elif operation[0] == 'pop':
        if len(queue) == 0:
            print(-1)
        else:
            print(queue.popleft())
    elif operation[0] == 'size':
        print(len(queue))
    elif operation[0] == 'empty':
        if len(queue) == 0:
            print(1)
        else: 
            print(0)
    elif operation[0] == 'front':
        if len(queue) == 0:
            print(-1)
        else:
            print(queue[0])
    elif operation[0] == 'back':
        if len(queue) == 0:
            print(-1)
        else:
            print(queue[-1])





deque()

1
2
from collections import deque
deque = deque()
deque.append(x) x를 오른쪽 끝에 삽입
deque.appendleft(x) x를 왼쪽 끝에 삽입
deque.pop() 오른쪽 끝 삭제하고 값 반환
deque.popleft() 왼쪽 끝 삭제하고 값 반환
deque.extend(arr) 주어진 배열을 순환하면서 오른쪽에 추가
deque.extendleft(arr) 주어진 배열을 순환하면서 왼쪽에 추가
deque.remove(x) x를 찾아서 삭제
deque.rotate(num) deque를 num 만큼 회전 (양수면 오른쪽, 음수면 왼쪽)

Leave a comment