1 분 소요

1. 문제

https://www.acmicpc.net/problem/1781

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

문제 번호	1	2	3	4	5	6	7
데드라인	1	1	3	3	2	2	6
컵라면 	6	7	2	1	4	5	1

위와 같은 상황에서 동호가 2, 6, 3, 1, 7, 5, 4 순으로 숙제를 한다면
2, 6, 3, 7 문제를 시간 내에 풀어  15개의 컵라면을 받을  있다.

문제는 동호가 받을  있는 최대 컵라면 수를 구하는 것이다.
위의 예에서는 15 최대이다.

문제를 푸는데는 단위 시간 1 걸리며,
 문제의 데드라인은 N이하의 자연수이다.
,  문제를   받을  있는 컵라면 수와
최대로 받을  있는 컵라면 수는 모두 231보다 작거나 같은 자연수이다.

// 입력
 줄에 숙제의 개수 N (1  N  200,000) 들어온다.
다음 줄부터 N+1번째 줄까지 i+1번째 줄에
i번째 문제에 대한 데드라인과
풀면 받을  있는 컵라면 수가 공백으로 구분되어 입력된다.

// 출력
 줄에 동호가 받을  있는 최대 컵라면 수를 출력한다.

// 예제 입력 1
7
1 6
1 7
3 2
3 1
2 4
2 5
6 1

// 예제 출력 1
15


2. 핵심 아이디어

  • 데드라인을 초과하는 문제는 풀 수 없음
  • 데이터의 개수는 최대 200,000
  • 정렬 및 우선순위 큐를 이용하여 O(NlogN)의 시간에 해결할 수 있음


3. Python 문제풀이

import sys
import heapq
input = sys.stdin.readline

n = int(input())
arr = []
q = []

# 문제 정보를 입력 받은 이후에, 데드라인을 기준으로 정렬
for i in range(n) :
  a, b = map(int, input().split())
  arr.append((a, b))

arr.sort()

for i in arr :
  a = i[0]
  heapq.heappush(q, i[1])
  # 데드라인을 초과하는 경우에는 최소 원소를 제거
  if a < len(q):
    heapq.heappop(q)

print(sum(q))


4. Java 문제풀이

import java.util.*;
import java.io.*;

public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int n = Integer.parseInt(br.readLine());
    Queue<int[]> q = new PriorityQueue<>((a, b) -> a[0]-b[0]);

    for (int i=0; i<n; i++)
      q.add(Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray());

    PriorityQueue<Integer> arr = new PriorityQueue<>();
    long result = 0;

    while (!q.isEmpty()){
      int[] a = q.poll();
      arr.add(a[1]);
      if (arr.size() > a[0]) arr.poll();
    }

    while (!arr.isEmpty()) result += arr.poll();
    System.out.println(result);
  }
}

댓글남기기