알고리즘 정복하기!/백준 문제풀이

백준 10845번 Python / Queue(큐)

by seokii 2022. 3. 20.
728x90
반응형

문제풀이 GitHub

https://github.com/Seokii/baekjoon

 

GitHub - Seokii/baekjoon: Daily Commit for Baekjoon

Daily Commit for Baekjoon. Contribute to Seokii/baekjoon development by creating an account on GitHub.

github.com

문제링크

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

 

10845번: 큐

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

www.acmicpc.net

 

풀이(시간 초과)

from collections import deque

n = int(input())
dq = deque()

for _ in range(n):
    command = list(input().split())
    if command[0] == 'push':
        dq.append(command[1])
    elif command[0] == 'pop':
        if len(dq) > 0 :
            tmp = dq.popleft()
            print(tmp)
        else : print(-1)
    elif command[0] == 'size':
        print(len(dq))
    elif command[0] == 'empty':
        if len(dq) > 0: print(0)
        else : print(1)
    elif command[0] == 'front':
        if len(dq) > 0: print(dq[0])
        else : print(-1)
    elif command[0] == 'back':
        if len(dq) > 0: print(dq[-1])
        else: print(-1)

파이썬에서는 dque 라이브러리를 통해 간단하게 큐를 구현할 수 있습니다.

.pop(), .append() 뿐만 아니라 .popleft(), appendleft(), reverse() 등을 사용해 쉽게 구현할 수 있습니다.

이 함수들을 통해 조건문을 작성했습니다.

풀이는 맞지만 시간 초과가 발생했습니다.

for문을 반복하면서 명령을 여러 줄 받기 때문에 입력 받는 시간을 줄일 필요가 있었습니다.

 

풀이(정답)

from collections import deque
import sys

input = sys.stdin.readline
n = int(input())
dq = deque()

for _ in range(n):
    command = list(input().split())
    if command[0] == 'push':
        dq.append(command[1])
    elif command[0] == 'pop':
        if len(dq) > 0 :
            tmp = dq.popleft()
            print(tmp)
        else : print(-1)
    elif command[0] == 'size':
        print(len(dq))
    elif command[0] == 'empty':
        if len(dq) > 0: print(0)
        else : print(1)
    elif command[0] == 'front':
        if len(dq) > 0: print(dq[0])
        else : print(-1)
    elif command[0] == 'back':
        if len(dq) > 0: print(dq[-1])
        else: print(-1)

입력을 받을 때 sys라이브러를 불러와

sys.stdin.readline()을 통해 입력 받을 때의 시간을 최대한 줄였습니다.

input 대신에 sys.stdin.readline을 집어넣어 코드를 수정해 정답을 맞췄습니다.

 

 

728x90
반응형

댓글