Algorithms/Java

99클럽 코테 스터디 7일차 TIL + 과제 진행하기 (java)

Jenn28 2024. 7. 29. 03:37

 

💡 문제

권장 시간

  • 1시간

소요 시간

  • 1시간 35분 + a

풀이 코드

import java.util.*;

class Plan {
    String name;
    int start, duration;
    
    public Plan(String name, int start, int duration) {
        this.name = name;
        this.start = start;
        this.duration = duration;
    }
}

class Solution {
    public ArrayList<String> solution(String[][] plans) {
        ArrayList<String> answer = new ArrayList<>();
        
        // 시작 시간 순으로 정렬
        PriorityQueue<Plan> pq = new PriorityQueue<>(new Comparator<Plan>() {
            @Override
            public int compare(Plan o1, Plan o2) {
                return o1.start - o2.start;
            }
        });
        
        // pq에 데이터 삽입
        for (String[] p : plans) {
            pq.add(new Plan(p[0], hourToMin(p[1]), Integer.parseInt(p[2])));
        }
        
        Stack<Plan> waitList = new Stack<>();
        Plan curr = pq.poll();
        int currTime = curr.start;

        while (!pq.isEmpty() || curr != null) {
            if (!pq.isEmpty() && (currTime + curr.duration) > pq.peek().start) {
                // 현재 과제를 멈추고 새로운 과제를 시작해야 하는 경우
                curr.duration -= pq.peek().start - currTime;
                currTime = pq.peek().start;
                waitList.push(curr);
                curr = pq.poll();
            } else {
                // 현재 과제를 끝낼 수 있는 경우
                currTime += curr.duration;
                answer.add(curr.name);
                curr = null;

                // 멈춰둔 과제가 있는 경우 이어서 진행
                if (!waitList.isEmpty()) {
                    curr = waitList.pop();
                } else if (!pq.isEmpty()) {
                    // 큐에서 새로운 과제를 가져옴
                    curr = pq.poll();
                    currTime = Math.max(currTime, curr.start);
                }
            }
        }

        return answer;
    }
    
    private int hourToMin(String time) {
        int h = Integer.parseInt(time.substring(0, 2));
        int m = Integer.parseInt(time.substring(3, 5));
        return h * 60 + m;
    }
}

 

이 코드는 주어진 과제 계획을 시작 시간 순서대로 처리하여 과제를 끝낸 순서대로 반환하는 기능을 구현한다.

 

10 중 7 정도까지 풀고 나머지 3을 못푼 문제라고 할 수 있다.

멈춘 과제를 Stack에 저장하고 불러오는거까진 구현했는데, 그 뒤에 애랑 어떻게 할건지가 헷갈렸다.

아마 풀이 노트에 거기까지 로직을 만들지 않고 코드를 작성해서 헷갈렸던 것 같다.

 

제대로 로직을 세워놓지 않고 코드를 치면 헷갈리니까 꼭 풀이를 끝까지 하고 코드에 치는 연습을 해야겠다 .. ㅜㅜ