본문 바로가기

Algorithms & Languages/파이썬 알고리즘 문제풀이

[Python/DailyAlgo] 93. 게으름뱅이

문제 접근 및 공부 내용, 풀이는 모두 하단 코드에 "주석"으로 포함되어 있으니 참고해주세요.

문제 유형 보기

https://dailyalgo.kr/ko/problems/93


풀이

from heapq import heappop, heappush
def solution(todoList):

    # 홀수 번째 날: 할 일을 받기만
    # 짝수 번째 날: 할 일을 받은 후 쌓인 일 중 하나를 처리
    # 각 일(todo)에는 이름, 마감 기한, 중요도가 부여됨.
    # 처리 기준:
    # 1. 마감 기한이 빠른 놈. (오름차순)
    # 2. 중요도가 가장 높은 놈. -> 반대로 설계하자 (오름차순)
    # 이름이 사전순으로 앞선 놈. (오름차순)

    # n일동안 주어지는 할 일 정보 todoList
    # 이름: 소문자, 중복 x -> 그냥 오름차순
    # 마감 기한: MM/DD/YYYY -> '/'으로 split해서, 3 1 2 순서로 오름차순 
    # 중요도: 5가지 0~4 하면 될듯 -> 딕셔너리에 indexing 쓰면 될듯?

    # 튜플 (YYYY, MM, DD, 중요도, 이름)
    # 실제 우선 순위(중요도) 개념과 달리, 숫자가 작을 수록 중요도 높다고 생각
    priorities = {'CRITICAL':0, 'HIGH':1, 'MODERATE':2, 'LOW':3, 'MINIMAL':4}

    days = 0
    heap = []
    answer = []
    # 이거 그냥 range(2*len(todoList))로 인덱스로 반복 돌려도 됨.
    for todo in todoList:
        # ex. ["presentation","11/10/2030","HIGH"]
        days += 1

        # 할 일을 받고
        # 이거 튜플 그대로 넣어도 되긴 함 이중 튜플로
        MM, DD, YYYY = map(int, todo[1].split('/'))
        heappush(heap, (YYYY, MM, DD, priorities[todo[2]], todo[0]))

        # 짝수날엔 쌓인 일 중 하나를 처리
        if days % 2 == 0:
            answer.append(heappop(heap)[4])

    # 여기서부턴 받을 일이 없으므로, 그냥 짝수날에 처리만 함.
    for _ in range(days):
        days += 1
        if days % 2 == 0:
            answer.append(heappop(heap)[4])

    return answer