본문 바로가기
Algorithm/Baekjoon

1781. 컵라면 (Python)

by 원만사 2022. 4. 27.
반응형
 

1781번: 컵라면

상욱 조교는 동호에게 N개의 문제를 주고서, 각각의 문제를 풀었을 때 컵라면을 몇 개 줄 것인지 제시 하였다. 하지만 동호의 찌를듯한 자신감에 소심한 상욱 조교는 각각의 문제에 대해 데드라

www.acmicpc.net

 

풀이

 그리디하게 현재 시간에서 풀 수 있는 문제의 리스트 중 가장 많은 컵라면 수를 얻을 수 있는 문제를 풀어 컵라면을 얻도록 하면 된다. 이때 현재 시간은 1에서부터가 아닌 제일 큰 데드라인부터 1씩 줄여가면서 풀 수 있는 문제에 대하여 컵라면 수를 우선순위 큐에 넣고 가장 큰 수를 꺼내어 풀면 된다.

 

 문제의 예제를 보면 가장 큰 데드라인은 6이다. 그렇기 때문에 시간은 6부터 시작한다. 현재 시간 6에서 풀 수 있는 문제는 7번이 있다. 7번을 풀고 얻을 수 있는 컵라면 수를 우선순위 큐에 넣어둔다.

  • 컵라면 : [1] 

 이제 컵라면 우선순위 큐에서 가장 큰 숫자를 꺼내어 결과에 더해준다.

  • 컵라면 : []
  • 총 컵라면 개수 : 1 

 

 시간은 줄어들어 3이 되었다(5와 4에는 풀 수 있는 문제가 없고 컵라면 큐도 비었기 때문에 풀 수 있는 문제가 없다). 이제 시간 3에 풀 수 있는 문제 3번과 4번의 컵라면 수를 큐에 넣는다.

  • 컵라면 : [2, 1]

 이제 컵라면 큐에서 가장 큰 숫자를 꺼내어 결과에 더해준다.

  • 컵라면 : [1]
  • 총 컵라면 개수 : 1 + 2 = 3 

 

 이제 시간 2에 풀 수 있는 문제 5번과 6번의 컵라면 수를 큐에 넣는다.

  • 컵라면 : [5, 4, 1]

 컵라면 큐에서 가장 큰 숫자를 꺼내어 결과에 더해준다.

  • 컵라면 : [4, 1]
  • 총 컵라면 개수 : 3 + 5 = 8

 

이제 시간 1에 풀 수 있는 문제 1번과 2번의 컵라면 수를 큐에 넣는다.

  • 컵라면 : [7, 6, 4, 1]

 컵라면 큐에서 가장 큰 숫자를 꺼내어 결과에 더해준다.

  • 컵라면 : [6, 4, 1]
  • 총 컵라면 개수 : 8 + 7 = 15

 

 이제 시간은 0이 되고 탐색은 종료된다.

 

코드

import heapq
import sys
input = sys.stdin.readline

if __name__ == '__main__':
    N = int(input())  # 숙제의 개수
    problems = []  # 숙제 정보를 담는 최대힙. 값은 (데드라인, 컵라면 수) 튜플의 형태로 담긴다.
    cups = []  # 현재 시간에서 풀 수 있는 문제의 컵라면 수를 담아두는 최대힙
    time = 0  # 현재 시간

    for _ in range(N):
        deadline, cup = map(int, input().split())
        time = max(time, deadline)  # 현재 시간은 가장 큰 데드라인으로 설정한다.

        # problems에 (-deadline, cup)을 넣어둔다.
        # 최대힙으로 사용하기 위해 -deadline을 넣어줬다.
        heapq.heappush(problems, (-deadline, cup))

    res = 0  # 얻을 수 있는 컵라면의 총 개수
    while time > 0:
        while problems:  # 아직 풀 수 있는 숙제들이 남아있는 경우에만
            nextDeadline, nextCup = heapq.heappop(problems)

            # 만약 다음 숙제의 데드라인이 현재 시간과 일치한다면 해당 문제의 컵라면 수를
            # cups에 넣어준다. 이때 최대힙을 구성하기 위해 -nextCup의 형태로 값을 삽입한다.
            if time == -nextDeadline:
                heapq.heappush(cups, -nextCup)
            else:  # 만약 현재 시간에 풀 수 없는 문제라면 다시 problems에 넣어주고 반복문을 종료한다.
                heapq.heappush(problems, (nextDeadline, nextCup))
                break

        # 현재 시간에 풀 수 있는 문제가 있다면 문제를 풀고 컵라면을 얻는다.
        if cups:
            res += -heapq.heappop(cups)

        time -= 1

    print(res)
반응형

'Algorithm > Baekjoon' 카테고리의 다른 글

2513. 통학버스 (Python)  (0) 2022.04.30
2550. 전구 (Python)  (0) 2022.04.28
11054. 가장 긴 바이토닉 부분 수열 (Python)  (0) 2022.04.26
7453. 합이 0인 네 정수 (Python)  (0) 2022.04.25
2539. 모자이크 (Python, Swift)  (1) 2022.04.23

댓글