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

[프로그래머스,Java] Level2: 택배상자

류창 2022. 11. 4. 22:07

 

문제분석

 

문제를 읽고 이해하는데도 꽤 난감한 문제다.

 

영재는  1,2,3,4,5... 와 같이 정규 컨테이너로 상자를 받는다.

 

하지만,  정규컨테이너로 받은 상자가,  주문순서와 다르다면,  보조 컨테이너에 넣어둔다.

 

보조컨테이너는 Stack의 형태를 띄운다.

 

보조 컨테이너와 ,정규컨테이너에서 받은 상자가, 주문순서와 다르다면  배송이 종료된다.

 

 

즉, 정리하자면

 

1. 정규컨테이너로 상자를받는다.

2. 만약 정규컨테이너가 주문순서와 다르다면, 보조컨테이너로

2-2. 만약 정규컨테이너가 주문순서라면,  출하한다.

여기서 While()로 한번 감싸준다. (왜냐하면 보조컨테이너에 여러개 연속으로 출하할수 있기때문)

3. 보조컨테이너가 주문순서와 같다면, 출하한다.

3-2.보조컨테이너가 주문순서와 다르다면,  종료시키고 .1번으로 돌아간다.

 

->이를 코드로 짜면된다.

문제풀이:

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
import java.util.*;
class Solution {
    public int solution(int[] order) {
        int answer = 0;
        
        Stack<Integer> stack = new Stack<>();
        
        int box =1;
        int idx =0;
        
        while(true){      
            //탈출조건
            if(box==order.length+1){
                break;
            }           
              //정규 컨테이너 실패 루트
              if(order[idx]!=box){
                stack.push(box);                
              }
              //정규 컨테이너 성공 루트
              else{
                answer++;
                idx++;
              }
              box++;
            
            while(true){
              //보조 컨테이너 성공 루트
              if(!stack.isEmpty()&&order[idx]==stack.peek()){
                answer++;
                stack.pop();
                idx++;
              }
              //보조 컨테이너 실패루트
              else{
                  break;
              }
            }
        }  
        return answer;
    }
}
cs