자료구조

자료구조 문제풀이 - 주문처리 (큐)

토리쟁이 2022. 7. 13. 00:30

 

class Queue:
    def __init__(self) :
        self.myQueue=[]

    def push(self, n) :
        self.myQueue.append(n)

    def pop(self) :
        if self.empty()==1:
            return
        else:
            del self.myQueue[0]


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

    def empty(self) :
        if self.size()==0:
            return 1
        else:
            return 0

    def front(self) :
        if self.empty()==1:
            return -1
        else:
            return self.myQueue[0]


    def back(self) :

        if self.empty()==1:
            return -1
        else:
            return self.myQueue[-1]

'''
함수 processOrder를 구현하세요.
'''

class orderInfo:
    '''
    이 부분은 수정하지 마세요.
    '''
    def __init__(self, t, d, v):
        self.time = t
        self.duration = d
        self.vip = v

def processOrder(orders) :
    '''
    주문 정보가 주어질 때, 주문이 처리되는 순서를 반환합니다.
    '''
    result = []
    normalQueue = Queue()
    vipQueue=Queue()

    jobEndTime=0 

    for i in range(len(orders)):

        if orders[i].vip==0: #일반 고객의 경우
            normalQueue.push(i) 
        else: #vip 고객인 경우
            vipQueue.push(i)
           
           
    while not(normalQueue.empty()==1 and vipQueue.empty()==1): #주문이 있다면 계속 반복
            #normal or vip
        targetQueue = selectQueue(normalQueue, vipQueue, jobEndTime, orders)
            
        index=targetQueue.front()	 #처리해야할 주문 번호를 가져오기
            
         #주문을 처리한다. ==> jobEndTime을 증가시킨다.
         #jobEndTime > orders[Index].time 인 경우 => 주문 밀린 상태 => 바로 다음 작업 시작
            
         #jobEndTime < order[Index].time 인 경우 => 주문 밀려있지 않음
         #=> 다음 작업이 들어온 시점에 처리(여유가 있음)
        jobEndTime = max(jobEndTime, orders[index].time) + orders[index].duration
            
        result.append(index+1)
        targetQueue.pop()
            
    return result


def selectQueue(normalQueue, vipQueue, time, orders):
        normalIndex=normalQueue.front()
        vipIndex=vipQueue.front()

        if vipIndex == -1:
            return normalQueue
        
        if normalIndex==-1:
            return vipQueue
        
        #밀린 작업이 노말에도 없고 vip에도 없는 경우
        #더 빨리 도착한 주문을 처리한다.
        if time < orders[normalIndex].time and time < orders[vipIndex].time:
            if orders[vipIndex].time<=orders[normalIndex].time:
                return vipQueue
            else:
                return normalQueue

        #밀린 작업이 노말에만 있는 경우
        if time>=orders[normalIndex].time and time < orders[vipIndex].time:
            return normalQueue
        
        #밀린 작업이 vip에만 있는 경우
        if time>=orders[vipIndex].time and time < orders[normalIndex].time:
            return vipQueue

        #밀린 작업이 노말에도 있고 vip에도 있는 경우
        return vipQueue

 

 

queue 라이브러리를 사용해서 푼 경우

empty=> 0과 1이 아닌 True/ False 반환

front/ back 존재 안함

push => put

pop=> get

'''
함수 processOrder를 구현하세요.
'''
    
from queue import Queue

class orderInfo:
    '''
    이 부분은 수정하지 마세요.
    '''
    def __init__(self, t, d, v):
        self.time = t
        self.duration = d
        self.vip = v

def processOrder(orders) :
    '''
    주문 정보가 주어질 때, 주문이 처리되는 순서를 반환합니다.
    '''
    jobEndTime=0

    result = []

    normalQueue = Queue()
    vipQueue=Queue()

    jobEndTime=0 
    curTime=-1

    for i in range(len(orders)):
        curTime=orders[i].time

        if orders[i].vip==0: #일반 고객의 경우
            normalQueue.put(i) 
        else: #vip 고객인 경우
            vipQueue.put(i)
        
    while not(normalQueue.empty() and vipQueue.empty()):
            #normal or vip
        targetQueue = selectQueue(normalQueue, vipQueue, jobEndTime, orders)
            
        #처리해야할 주문 번호를 가져오기
        index=targetQueue.queue[0]
            
        #주문을 처리한다. ==> jobEndTime을 증가시킨다.
        #jobEndTime > orders[Index].time 인 경우 => 주문 밀린 상태 => 바로 다음 작업 시작
            
        #jobEndTime < order[Index].time 인 경우 => 주문 밀려있지 않음
        #=> 다음 작업이 들어온 시점에 처리(여유가 있음)
        jobEndTime = max(jobEndTime, orders[index].time) + orders[index].duration
        result.append(index+1)
        targetQueue.get()
            
    return result

def selectQueue(normalQueue, vipQueue, time, orders):
        normalIndex=-1 if len(normalQueue.queue) ==0 else normalQueue.queue[0]
        vipIndex=-1 if len(vipQueue.queue) ==0 else vipQueue.queue[0]

        if vipIndex == -1:
            return normalQueue
        
        if normalIndex==-1:
            return vipQueue
        
        #밀린 작업이 노말에도 없고 vip에도 없는 경우
        #더 빨리 도착한 주문을 처리한다.
        if time < orders[normalIndex].time and time < orders[vipIndex].time:
            if orders[vipIndex].time<=orders[normalIndex].time:
                return vipQueue
            else:
                return normalQueue

        #밀린 작업이 노말에만 있는 경우
        if time>=orders[normalIndex].time and time < orders[vipIndex].time:
            return normalQueue
        
        #밀린 작업이 vip에만 있는 경우
        if time>=orders[vipIndex].time and time < orders[normalIndex].time:
            return vipQueue

        #밀린 작업이 노말에도 있고 vip에도 있는 경우
        return vipQueue