https://school.programmers.co.kr/learn/courses/30/lessons/176962
문제 분류 : 코딩테스트 연습 > 연습문제 > 과제 진행하기
난이도 : 2
문제 접근
정렬 + 스택 활용 문제이다.
1. 시작 시간이 빠른 순서대로 정렬한다. (우선순위 큐에 넣기)
2. 새로운 과제를 시작할 시간이 되었을 때 기존에 진행 중이던 과제가 있다면 과제를 멈추고 새로운 과제를 시작합니다. (스택을 활용한다.)
정답 코드
import java.util.*;
class Solution {
static class task{
String name; int start; int play;
public task(String name, int start, int play){
this.name = name; this.start = start; this.play = play;
}
}
public String[] solution(String[][] plans) {
PriorityQueue<task> pq = new PriorityQueue<>((o1,o2)-> o1.start-o2.start);
for(int i = 0; i < plans.length; i++){
String name = plans[i][0];
int start = calculate(plans[i][1]);
int play_time = Integer.parseInt(plans[i][2]);
pq.add(new task(name, start, play_time));
}
ArrayList<String> list = new ArrayList<>();
Stack<task> stack = new Stack<>();
int cur = 0;
while(!pq.isEmpty()){
task task = pq.poll();
int before = cur;
cur = task.start;
int remain = cur - before;
while(!stack.isEmpty() && 0 < remain){
task temp = stack.pop();
if(temp.play - remain == 0){
list.add(temp.name);
break;
}
else if(temp.play - remain > 0){
stack.push(new task(temp.name, temp.start, temp.play - remain));
break;
}
else if(temp.play - remain < 0){
remain -= temp.play;
list.add(temp.name);
}
}
stack.push(task);
}
while(!stack.isEmpty()){
task temp = stack.pop();
System.out.println(temp.play);
list.add(temp.name);
}
String [] answer = new String[list.size()];
for(int i = 0; i < list.size(); i++){
answer[i] = list.get(i);
}
return answer;
}
public static int calculate(String temp){
String [] split = temp.split(":");
return Integer.parseInt(split[0]) * 60 + Integer.parseInt(split[1]);
}
}
'Algorithm > Programmers Java' 카테고리의 다른 글
Java 프로그래머스 카카오프렌즈 컬러링북 (0) | 2024.02.28 |
---|---|
Java 프로그래머스 연속된 부분 수열의 합 (2) | 2024.02.28 |
Java 프로그래머스 광물 캐기 (0) | 2024.02.28 |
Java 프로그래머스 리코쳇 로봇 (2) | 2024.02.28 |
Java 프로그래머스 미로 탈출 (2) | 2024.02.28 |