https://algospot.com/judge/problem/read/LUNCHBOX
코드설명
그리디(탐욕법, Greedy) + 병렬처리(Parallel Processing)를 활용합니다.
그리디 방식은, 각 도시락의 식사 시간이 최대한 늦은 것을 순서대로 먹어야 합니다.
문제에서 중요한점은, 먹는 과정은 전자레인지를 돌리는 과정과 다른사람이 밥먹는 과정이 동시에 일어날 수 있습니다. 즉, 병렬로 처리가능합니다. 아래와 같이 ret = Math.maxret, beginEat + E[box]) 로 해당 로직을 처리할 수 있습니다.
여러 사람이 동시에 도시락을 먹는 상황을 시뮬레이션합니다.
// 해당 순서대로 데워먹는 과정을 시뮬레이션한다.
int ret = 0, beginEat = 0;
for (int i = 0; i < N; i++) {
int box = order.get(i).foodIndex;
beginEat += M[box];
ret = Math.max(ret, beginEat + E[box]);
}
코드
package Main;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;
public class Main {
private static int N, K, M;
private static int answer = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int C = Integer.parseInt(st.nextToken());
while(C-- > 0) {
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
int[] M = new int[N]; // 각 도시락의 전자레인지 시간
int[] E = new int[N]; // 각 도시락의 식사 시간
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
M[i] = Integer.parseInt(st.nextToken());
}
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
E[i] = Integer.parseInt(st.nextToken());
}
System.out.println(heat(M, E));
}
}
private static int heat(int[] M, int[] E) {
// 어느 순서로 데워야 할지를 정한다.
ArrayList<Node> order = new ArrayList<>();
for (int i = 0; i < N; i++) {
order.add(new Node(-E[i], i));
}
Collections.sort(order);
// 해당 순서대로 데워먹는 과정을 시뮬레이션한다.
int ret = 0, beginEat = 0;
for (int i = 0; i < N; i++) {
int box = order.get(i).foodIndex;
beginEat += M[box];
ret = Math.max(ret, beginEat + E[box]);
}
return ret;
}
private static class Node implements Comparable<Node>{
int eatTime, foodIndex;
public Node(int eatTime, int foodIndex) {
this.eatTime = eatTime;
this.foodIndex = foodIndex;
}
@Override
public int compareTo(Node other) {
return Integer.compare(this.eatTime, other.eatTime);
}
}
}