isPowerfulBlog

[re-Solved] BOJ: 10845 | 큐 본문

Algorithm

[re-Solved] BOJ: 10845 | 큐

왕밤빵도라에몽 2024. 12. 10. 21:22

처음부터 다시 공부하는 알고리즘 / 자료구조....

 

 

2년 전 코드

from collections import deque
import sys
input = sys.stdin.readline

N = int(input())
q = deque([])

def command(com_list, queue):
    # push
    if len(com_list) > 1:
        if com_list[0] == 'push':
            queue.append(int(com_list[1]))
    # size, empty, pop, front, back
    else:
        if com_list[0] == 'pop':
            if queue:
                print(queue.popleft())
            else:
                print(-1)
        elif com_list[0] == 'size':
            print(len(queue))
        elif com_list[0] == 'empty':
            if queue:
                print(0)
            else:
                print(1)
        elif com_list[0] == 'front':
            if queue:
                print(queue[0])
            else:
                print(-1)
        elif com_list[0] == 'back':
            if queue:
                print(queue[-1])
            else:
                print(-1)

    return queue

for i in range(N):
    com = list(input().split())
    q = command(com, q)

 

 

 

  • (good) sys.stdin.readline 써서 입력 속도 개선
  • (bad) if, else 남발, 객체지향 X, 유지보수 어려운 코드, 가독성 구림

 

 

개선 코드

import sys
from collections import deque

input = sys.stdin.readline

class CustomQueue():
    def __init__(self):
        self.queue = deque([])

    def push(self, item):
        self.queue.append(item)

    def pop(self):
        if self.queue:
            return self.queue.popleft()
        else:
            return -1

    def size(self):
        return len(self.queue)

    def empty(self):
        if not self.queue:
            return 1
        else:
            return 0

    def front(self):
        if self.queue:
            return self.queue[0]
        else:
            return -1

    def back(self):
        if self.queue:
            return self.queue[-1]
        else:
            return -1

    def operate(self, opt):
        operators = {
            'front': self.front,
            'back': self.back,
            'size': self.size,
            'empty': self.empty,
            'pop': self.pop
        }
        return operators[opt]()

if __name__=="__main__":
    custom_queue = CustomQueue()
    n = int(input())
    for _ in range(n):
        inputs = input().split()
        if len(inputs) == 1:
            opt = inputs[0]
            sys.stdout.write(str(custom_queue.operate(opt)) + "\n")
        else:
            opt, item = inputs[0], int(inputs[1])
            custom_queue.push(item)

 

 

  • (good) sys.stdin.readline / sys.stdout.write 써서 입출력 속도 개선, 객체지향, 유지보수 및 가독성 개선

 

 

배운점 / 다시 상기한 점

  • from collections import deque
    • 일반적인 큐 / 스레드 안전 보장 X / 성능상 이점  -> 싱글스레드에서 활용
    • append
    • pop(우) / popleft(좌)
    • 빠른 큐, 양방향 큐
  • fromt queue import Queue
    • 스레드 안전 보장 / 블로킹 지원 -> 멀티스레드에서 활용
    • put
    • get
    • 안전한 큐
  • 입출력
    • input() = sys.stdin.readline()
    • print() = sys.stdout.write( ... + "\n")
      • 줄바꿈 안 해주니 반드시 추가하기
      • string만 출력되니 반드시 str()입히기

'Algorithm' 카테고리의 다른 글

[re-Solved] BOJ: 10828 | 스택  (0) 2024.12.10
[re-Solved] BOJ: 9012 | 괄호  (0) 2024.12.10
[Solved] BOJ: 2457 | 공주님의 정원  (2) 2023.12.22
[자료구조] 큐, 스택, 힙  (1) 2023.11.16
[Solved] BOJ: 11725 | 트리의 부모 찾기  (0) 2023.02.02