[프로그래머스]과제 진행하기

allnight5·2023년 6월 13일
0

프로그래머스

목록 보기
67/73
import java.util.*;
class Solution {
    public String[] solution(String[][] plans) {
        int endPoint = plans.length;
        List<String> answer = new ArrayList<>(); 
        Task[] tasks = new Task[endPoint];
        
        for(int i=0; i<endPoint;i++){
            Task task = new Task(plans[i]);
            tasks[i]= task;
        }
        //오름차순정렬
        //내림차순 정렬이 하고싶다면 b.start-a.start
        //형식으로 해주면된다.
        Arrays.sort(tasks, (a, b) -> { 
            return a.start - b.start;
        });
        
        Stack<Task> waitTask = new Stack<>();
        int curTime = -1;  
        
        for(int i=0; i<endPoint;i++){ 
        
            if(waitTask.isEmpty()){
                waitTask.push(tasks[i]);
                continue;
            } 
            Task curT = waitTask.peek();
            Task newT = tasks[i];
            
            //매번 구해주면 시간이 걸리니 start와 tiem을 합쳐서 현재 작업 시간을 넣어준다.
            curTime = curT.start+curT.time;
            
            //현재 작업시간보다 다음 작업 시작시간이 길다면 끝났으니 answer에 넣어준다.
            if(curTime <= newT.start){
                answer.add(waitTask.pop().taskName);  
            } else{
            //여기 때문에 좀 걸림 
            //전에것을 작업중 새로 들어온것이기 때문에
            //작업 시작시간을 새로 들어온 시작 시간에서 빼서
            //남은 작업시간에 빼줘야하는데
            //그 시간을 그대로 넣어줘서 문제가 발생했음
                curT.time -= newT.start - curT.start;
                waitTask.push(newT);
                continue;
            }
            
            //현재작업이 끝났으니 남아있는 시간을 활용하여
            //남아있는 과제들을 처리한다.
            waitTaskPop(waitTask, newT, curTime, answer);
            
            //확인작업이 끝났는데 진행이 안되었으니
            //stack에 넣어서 다음작업을 진행한다.
            waitTask.push(tasks[i]);
        }
        //남아있는 과제를 진행하여 종료시키며
        //answer에 넣어준다.
        while(!waitTask.isEmpty()){
            answer.add(waitTask.pop().taskName);
        }
        return answer.toArray(new String[0]);
    }  
    
    public void waitTaskPop(Stack<Task> waitTask,Task newT, int curTime, List<String> answer){
        while(!waitTask.isEmpty()){
        	//새로운 작업을 할 대기중내용을 배출한다.
            Task work = waitTask.pop();
            //현재 시간에서 다음 작업시작시간을 빼서 얼마나 다음작업을 할수있는지 시간을 구한다.
            int point = newT.start- curTime;
            //남은 작업시간보다 작업시간이 작다면 
            //answer에 넣어주고 현재시간에 작업시간을 더해준다.
            if(work.time <= point){
                answer.add(work.taskName); 
                curTime += work.time;
            }
            //더 적다면 진행 시간만큼 작업시간을 빼주고 다시 
            //stack에 넣어주고 반복문을 빠져나오게 하여 메서드를 종료시킨다.
            else{
                work.time -= point;
                waitTask.push(work);
                break;
            }
        } 
    }
    
    
    static class Task{
        private String taskName;
        private int start;
        private int time;
        Task(String[] plan){
            this.taskName = plan[0];
            this.start = resultSecon(plan[1]);
            this.time = Integer.parseInt(plan[2]);
        } 
    
        public int resultSecon(String startTime){
            String[] time = startTime.split(":");
            int hour = Integer.parseInt(time[0])*60;
            int minutes = Integer.parseInt(time[1]);
            return hour+minutes;
        }
    }
}
profile
공부기록하기

0개의 댓글