[코딩테스트][SWEA] 🔥 SWEA 2477번 "차량 정비소" 문제: Python으로 완벽 해결하기! 🔥

김상욱·2024년 9월 5일
0
post-thumbnail

문제 링크

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV6c6bgaIuoDFAXy

🕒 Python 풀이시간: 1시간 30분

from collections import deque
import heapq

for tc in range(1,int(input())+1):
    answer=0
    N,M,K,A,B=map(int,input().split())
    clientLog=dict()
    receptionDeskT=[0]+list(map(int,input().split()))
    receptionDeskLog=[]
    for i in range(1,N+1):
        heapq.heappush(receptionDeskLog,(0,i))
    maintenanceWindowT=[0]+list(map(int,input().split()))
    maintenanceWindowLog=[]
    for i in range(1,M+1):
        heapq.heappush(maintenanceWindowLog,(0,i))
    timeList=[0]+list(map(int,input().split()))
    visitTime=[]
    for i in range(1,K+1):
        visitTime.append((i,timeList[i]))
        clientLog[i]=dict()
    visitTime.sort(key=lambda x:x[1])
    visitTimeQ=deque(visitTime)
    inputClient=[]
    inputClient2=[]
    receptionDeskChoice=[]
    maintenanceWindowChoice=[]
    waitClient=[]
    t=0
    endClient=[]
    endClientNum=0
    while True:
        # 접수 창구에 들어갈 고객 선정
        while len(visitTimeQ)>0 and visitTimeQ[0][1]==t:
            now=visitTimeQ.popleft()
            heapq.heappush(inputClient,now)
        # 투입할 접수 창구 선정
        while len(receptionDeskLog)>0 and receptionDeskLog[0][0]<=t:
            now=heapq.heappop(receptionDeskLog)
            heapq.heappush(receptionDeskChoice,now[1])
        # 접수 창구에 고객 투입
        while len(receptionDeskChoice)>0 and len(inputClient)>0:
            client=heapq.heappop(inputClient)
            desk=heapq.heappop(receptionDeskChoice)
            heapq.heappush(receptionDeskLog,(t+receptionDeskT[desk],desk))
            heapq.heappush(waitClient,(t+receptionDeskT[desk],desk,client[0]))
            clientLog[client[0]]=[desk]

        # 투입할 정비 창구 선정
        while len(maintenanceWindowLog)>0 and maintenanceWindowLog[0][0]<=t:
            now=heapq.heappop(maintenanceWindowLog)
            heapq.heappush(maintenanceWindowChoice,now[1])

        # 정비 창구에 고객 투입
        while len(maintenanceWindowChoice)>0 and len(waitClient)>0 and waitClient[0][0]<=t:
            client=heapq.heappop(waitClient)
            desk=heapq.heappop(maintenanceWindowChoice)
            heapq.heappush(maintenanceWindowLog,(t+maintenanceWindowT[desk],desk))
            clientLog[client[2]].append(desk)
            endClientNum+=1
        
        # 완료된 사람이 K명이면 종료
        if endClientNum==K:
            break
        t+=1
    for key in clientLog.keys():
        if clientLog[key]==[A,B]:
            answer+=key
    if answer==0:
        print("#"+str(tc)+" "+str(-1))
    else:
        print("#"+str(tc)+" "+str(answer))

차량 정비소 시뮬레이션: 고객의 우선순위를 관리하라! 🚗🔧

차량 정비소의 상황을 정비소에 따라 고객이 들어가는 것을 고려하여 시뮬레이션 하는 문제이다. 각 상황에 따라 우선순위가 있기 때문에 꽤 까다로웠다.

먼저 우선순위 큐에 도착시간이 우선이 되게 해서 고객들을 담는다. 그런 다음 시간에 따라 현재 시간에 도착한 손님들을 inputClient에 담아둔다. 먼저 도착한 것과 상관없이 단순히 고객번호가 낮은 순으로 들어가기 때문에 우선순위큐로 담아서 관리한다. 그 다음 빈 창구를 찾는다. 창구는 번호 순이기 때문에 우선순위 큐에 넣어놓고 꺼내되 현재 시간에 비어있는 창구여야한다. (여기서 이후에 시간에 비었는지를 확인할 수 있는 형태로 창구를 둘 것이다.

이제 접수 창구에 손님들을 투입할 차례이다. 들어갈 수 있는 손님 inputClient와 비어있는 창구가 있다면 이를 꺼내서 상태를 갱신한다. 창구의 경우는 현재 시간에다가 창구의 이용시간을 더해서 넣는다. 이렇게 되면 이후에 이 값보다 시간이 작거나 같다면 창구가 비어있는 상태인 것이다. 고객은 이제 정비 창구에 들어가야 하므로 정비 창구에 들어가는 문제의 우선순위에 따라 값을 설정하여 넣는다. 이때는 먼저 도착한 순서대로 들어가도록 도착 시간, 들렀던 접수 창구의 번호를 함께 넣는다.

이제 watiClient에 정비 창구에 들어갈 손님들이 들어가 있으므로 꺼내면 된다. 이때, 도착 시간 값이 현재 시간보다는 작거나 같아야 한다. 이 값을 비교해주지 않으면 아직 진행 중인 손님도 waitClient에 들어가 있으므로 이 고객도 처리될 수 있기 때문이다. 손님과 창구를 매칭시켜주면서 똑같이 정비 창구도 현재시간에 이용시간을 넣어 갱신시켜주고 손님은 사실상 창구를 방문하는 순간 우리가 손님에 대해 알아야 하는 정보는 끝이기 때문에 어느 창구를 들렸는지만 기록해준다.

최종적으로 이렇게 기록된 어느 창구인지의 기록을 주어진 A,B 값과 비교하면 몇 명이나 답에 포함되는지를 알 수 있다.

이렇게 Python로 SWEA의 "차량 정비소" 문제를 해결해보았습니다. 코드와 개념 설명을 참고하여 문제를 해결하는 데 도움이 되셨길 바랍니다! 😊

0개의 댓글