Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

csct3434

[level 2] 과제 진행하기 - 176962 본문

프로그래머스

[level 2] 과제 진행하기 - 176962

csct3434 2024. 2. 29. 03:31

문제 링크

 

프로그래머스

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

programmers.co.kr

import java.util.Arrays;
import java.util.Comparator;
import java.util.Stack;

class Solution {

    public String[] solution(String[][] plans) {
        String[] answer = new String[plans.length];
        int index = 0;

        for (String[] plan : plans) {
            String[] split = plan[1].split(":");
            int minutes = Integer.parseInt(split[0]) * 60 + Integer.parseInt(split[1]);
            plan[1] = String.valueOf(minutes);
        }

        Arrays.sort(plans, Comparator.comparingInt(p -> Integer.parseInt(p[1])));

        Stack<int[]> stack = new Stack<>();
        for (int taskNumber = 0; taskNumber < plans.length - 1; taskNumber++) {
            int currentTaskEndTime = Integer.parseInt(plans[taskNumber][1]) + Integer.parseInt(plans[taskNumber][2]);
            int nextTaskStartTime = Integer.parseInt(plans[taskNumber + 1][1]);

            if (currentTaskEndTime > nextTaskStartTime) {
                stack.push(new int[]{taskNumber, currentTaskEndTime - nextTaskStartTime});
                continue;
            }

            answer[index++] = plans[taskNumber][0];

            int freeTime = nextTaskStartTime - currentTaskEndTime;
            while (!stack.isEmpty() && freeTime > 0) {
                int[] taskInfo = stack.pop();
                int remainingTime = taskInfo[1];

                if (remainingTime <= freeTime) {
                    answer[index++] = plans[taskInfo[0]][0];
                    freeTime -= remainingTime;
                    continue;
                }

                stack.push(new int[]{taskInfo[0], remainingTime - freeTime});
                break;
            }
        }

        answer[index++] = plans[plans.length - 1][0];

        while (!stack.isEmpty()) {
            int[] taskInfo = stack.pop();
            answer[index++] = plans[taskInfo[0]][0];
        }

        return answer;
    }
}