과제 진행하기(프로그래머스-연습문제)

권 해·2023년 4월 1일
0

Algorithm

목록 보기
43/49

문제

코드

import java.util.*;
class Solution {
    public String[] solution(String[][] plans) {
        String[] answer = new String[plans.length];
        Stack<String[]> working=new Stack<>();
        Queue<String[]> wait=new LinkedList<>();
        int index=0;
        
        Arrays.sort(plans,(a,b)->{
            if(a[1].split(":")[0].equals(b[1].split(":")[0]))
                return Integer.parseInt(a[1].split(":")[1])-Integer.parseInt(b[1].split(":")[1]);
            
            else 
                return Integer.parseInt(a[1].split(":")[0])-Integer.parseInt(b[1].split(":")[0]);
        });
        
        for(String[] s:plans)
            wait.add(s);
        
        while(!wait.isEmpty()){
            working.push(wait.poll());
            if(wait.isEmpty()){
                while(!working.isEmpty()){
                    answer[index]=working.pop()[0];
                    index++;
                }
                break;
            }
            int term=calcTerm(wait.peek()[1],working.peek()[1]);
            while(!working.isEmpty()){
                if(term>=Integer.parseInt(working.peek()[2])){
                    answer[index]=working.peek()[0];
                    term-=Integer.parseInt(working.pop()[2]);
                    index++;
                }
                else{
                    String[] work= working.pop();
                    work[2]=String.valueOf((Integer.parseInt(work[2])-term));
                    working.push(work);
                    break;
                }
            }
        }
        return answer;
    }
    public int calcTerm(String wait, String working){
        int waitMin=Integer.parseInt(wait.split(":")[0])*60+Integer.parseInt(wait.split(":")[1]);
        int workMin=Integer.parseInt(working.split(":")[0])*60+Integer.parseInt(working.split(":")[1]);
        return waitMin-workMin;
    }
}

풀이

문제에서 요구한 대로 의식의 흐름대로 풀면 된다.
나는 대기중인 과제를 큐에, 시작한 과제는 스택을 활용해서 다루었다.

(1) 과제 리스트를 시작 시각 순서대로 정렬한 후, 큐(대기중인 과제)에 넣어준다.
(2) 대기중인 과제가 없을 때까지 반복문을 실행한다.

  • 다음 시작할 과제를 스택(시작한 과제)에 넣어준다.
  • 만약 더이상 대기중인 과제가 없다면, 시작한 과제를 순서대로 모두 마무리 해준 후 반복문을 빠져 나온다.
  • term(다음 과제를 시작하기까지) 남은 시간을 계산해준다.
  • 남은 시간동안 마무리할 수 있는 과제를 전부 처리하고,(스택에서 빼내준다). 마무리 할 수 없는 과제는 남은 시간만큼만 시간을 차감해 준다.

결과

문제에서 요구하는대로 구현해준다면 크게 어렵지 않은 문제였다.
스택,큐를 활용하는 문제유형인지는 잘 모르겠는데 뭔가 익숙한 느낌이 드는 문제였다.

출처 : 프로그래머스 코딩 테스트 연습 https://school.programmers.co.kr/learn/challenges

0개의 댓글

관련 채용 정보