BOJ 1781 (시간초과..)
위 문제는 백준 사이트의 알고리즘 1781 문제에 관한 설명입니다.
BOJ 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 이하이다.
또, 각 문제를 풀 때 받을 수 있는 컵라면 수와 최대로 받을 수 있는 컵라면 수는 모두 32비트 정수형 범위 이내이다.
입력
첫 줄에 숙제의 개수 N (1<=N<=200,000)이 들어온다.
다음 줄부터 N+1번째 줄까지 i+1번째 줄에 i번째 문제에 대한 데드라인과 풀면 받을 수 있는 컵라면 수가 공백으로 구분되어 입력된다.
출력
첫 줄에 동호가 받을 수 있는 최대 컵라면 수를 출력한다.
package greedy;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;
class Main {
static class MyComparator implements Comparator<int[]> {
@Override
public int compare(int[] o1, int[] o2) {
// TODO Auto-generated method stub
if (o1[0] == o2[0])
return o2[1] - o1[1];
return o1[0] - o2[0];
}
}
public static void main(String[] args)throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[][] array = new int[N+1][2];
boolean[]visited = new boolean[N+1];
for (int i = 1; i <= N; i++) {
StringTokenizer st =new StringTokenizer(br.readLine());
int deadLine = Integer.parseInt(st.nextToken());
array[i][0] = deadLine;
int cupRamyeon = Integer.parseInt(st.nextToken());
array[i][1] = cupRamyeon;
}
Arrays.sort(array, new MyComparator());
int sum = 0;
for(int time = 1 ; time <= N;time++)
{
for(int i = 1; i <= N; i++)
{
if(array[i][0] <= time && !visited[array[i][0]])
{
sum+= array[i][1];
visited[array[i][0]] = true;
}
else {
continue;
}
}
}
System.out.println(sum);
}
}
결과부터 말하자면
시간초과 났습니다..
처음엔 Comparator를 연습하려고 푼 문제였는데 배열로 풀었더니 시간 초과가 났습니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
PriorityQueue<Ramyeon> priorityQueue = new PriorityQueue<Ramyeon>();
for (int i = 1; i <= N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int deadLine = Integer.parseInt(st.nextToken());
int cupRamyeon = Integer.parseInt(st.nextToken());
priorityQueue.offer(new Ramyeon(deadLine, cupRamyeon));
}
int sum = 0;
int time =1;
Ramyeon temp1;
while (!priorityQueue.isEmpty()) {
Ramyeon temp = priorityQueue.poll();
if (time <= temp.deadLine) {
System.out.println(temp.deadLine + " " + temp.Ramyeon);
sum += temp.Ramyeon;
}
while (!priorityQueue.isEmpty() && priorityQueue.peek().deadLine == time) {
temp1 = priorityQueue.poll();
System.out.println("poll : " + temp1.deadLine + " " + temp1.Ramyeon);
}
time++;
}
System.out.println(sum);
}
}
class Ramyeon implements Comparable<Ramyeon> {
int deadLine;
int Ramyeon;
Ramyeon(int deadLine, int Ramyeon) {
this.deadLine = deadLine;
this.Ramyeon = Ramyeon;
}
@Override
public int compareTo(Ramyeon o) {
// TODO Auto-generated method stub
if (this.deadLine == o.deadLine)
return o.Ramyeon - this.Ramyeon;
return this.deadLine - o.deadLine;
}
}
우선순위 큐로 Comparable도 활용해서 수정 중 입니다..
반례도 나오는걸 찾았습니다..
4
1 7
1 6
3 2
3 1
테스트 케이스 대다수는 통과하지만 몇개 통과하지 않아서 금방 고칠줄 알았는데..
몇 시간 째 잡고 있지만 해결이 안되었습니다.
혹시 해결하는 방법을 알아내신분이 계신다면 댓글 남겨주세요!