알고리즘/프로그래머스 Level2

[프로그래머스,Java] Level2: 과제 진행하기

류창 2023. 4. 1. 22:25
반응형

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

 

프로그래머스

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

programmers.co.kr

 

 

Level2: 택배상자와 비슷한 문제다.

 

Stack을 사용하여,  보조 컨테이너를 하나더 생산해서  일을 처리하는 부분에서 그렇다.

 

근데, 이 과제 진행하기가 조금 더 난이도가 있다.

이것저것 할게 많아서 그런거같다.

 

 

사전준비:  String -> Int   문자열 정리 메소드  ,  시간순서대로 정렬

 

 

 

여기서부터 로직

 

1. 과제진행

2. 과제를 진행하는데  다음 과제할 시간이 되있는지 체크

2-1 . 2번에서 다음 과제할 시간이 되면 이때, 과제를 멈추고  1번으로 돌아감

3. 현재 과제 완료 

4.  과제는 완료했는데, 다음 과제 시간까지 시간이 남네?
이 남은 시간동안 멈춘 과제 하자. 

다시 1번 반복

=> 5 .모든 과제를  탐색했고, 멈춰둔 과제를 순서대로 진행하면 끝

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import java.util.*;
class Solution {
    public String[] solution(String[][] plans) {
        String[] answer = new String[plans.length];
        
        Stack<String[]> stop = new Stack<>();
        
        Arrays.sort(plans,(a,b)->ToSec(a[1])-(ToSec(b[1])));
      
        
        int size = plans.length;
        
        int z=0;
        int idx=0;
        int current=0;
        String type ="";
        int time =0;
        int period =0;
        int next=0;        
        while(size!=idx){
            
            type=plans[idx][0];
            time = ToSec(plans[idx][1]);
            period = Integer.parseInt(plans[idx][2]);
            
            current=time+period;
            
            //새로운 과제가 틀어 막는지 체크
            if(size-1!=idx){      
             next = ToSec(plans[idx+1][1]);
            if(current>next){
               
                stop.push(new String[]{type,current-next+""});
                current=next;
                idx++;
                
                continue;
                
                }
            }
            
            //지금 과제 완료
            answer[z++]=type;
            
            // 남은시간동안 멈춘 과제를 할수있을까?
            while(!stop.isEmpty()){
                
                int remain = next-current;
                
                String[] work = stop.pop();
                
                int re_p =Integer.parseInt(work[1]);
                
                //멈춘과제 완료
                if(remain>=re_p){
                    
                    answer[z++]=work[0];
                    current+=re_p;
                }else{
                    //과제를 또 멈춰야할때            
                    stop.push(new String[]{work[0],re_p-remain+""});
                    break;
                }
                  
            }
        
            
            idx++;
        }
        
        //모든 과제를 탐색했다. 이젠 남은 멈춘과제 마저하자
        while(!stop.isEmpty()){
            answer[z++]=stop.pop()[0];
        }
        
        return answer;
    }
    
    public int ToSec (String time){
        
        String[] t = time.split(":");
        int h =Integer.parseInt(t[0])*60;
        int m =Integer.parseInt(t[1]);
        
        return h+m;
    }
}
cs

 

반응형