본문 바로가기
Algorithm/Programmers Java

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

by 제우제우 2024. 2. 28.

https://school.programmers.co.kr/learn/courses/30/lessons/176962

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 분류 : 코딩테스트 연습 > 연습문제 > 과제 진행하기

난이도 : 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]);
    }
}