Home 프로그래머스 택배상자 Lv2
Post
Cancel

프로그래머스 택배상자 Lv2


Queue와 Stack을 사용하여 문제내용대로 그대로 코드로 구현하였다.

  1. 메인 컨테이너와 주문내역 일치하지 않으면 서브컨테이너와 확인
  2. 서브컨테이너와도 맞지않을 시 주문내역에 맞는 상품이 나올 때 까지 서브컨테이너에 add
  3. 서브컨테이너에 들어있는 숫자보다 주문내역이 작다면 break
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
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

public class 택배상자 {

	public static void main(String[] args) {
		int[] order = {2, 1, 3, 5, 4};
		solution(order); 
	}
	
	static int solution(int[] order) {
        int answer = 0;
        
        Queue<Integer> orderQueue = new LinkedList<>();//주문내역
        Queue<Integer> mainQueue = new LinkedList<>();//컨테이너 벨트에서 내려는 상품
        Stack<Integer> serveStack = new Stack<>();//서브컨테이너
        
        for(int i=1; i<=order.length; i++) {//컨테이너에서 내려오는 상품 세팅
        	mainQueue.add(i);
        }
        
        for(int num : order) {//주문내역 큐로 변환
        	orderQueue.add(num);
        }
        
        int serveIndex = 1;//현재 서브컨테이너에 들어있는 상품 최대값
        
        while(true) {
        	if(orderQueue.peek()==mainQueue.peek()) {//컨테이너벨트에서 내려오는 상품과 주문내역이 맞으면 둘다 삭제하고 answer++;
        		answer++;
        		serveIndex++;
        		orderQueue.remove();
        		mainQueue.remove();
        	}
        	else {
        		int serveNum=0;
        		if(serveStack.size()>0) {//서브컨테이너에 상품있으면 가져옴
        			serveNum = serveStack.peek();
        		}
        		if(serveNum==orderQueue.peek()) {//서브컨테이너에 상품과 주문내역 일치하면 answer++;
        			answer++;
        			serveStack.pop();
        			orderQueue.remove();
        		}
        		else {
        			if(serveIndex>orderQueue.peek()) {//서브컨테이너 상품의 최대값이 주문내역 첫번째 상품보다 크면 더이상 채울수 없으므로 break
        				break;
        			}
        			for(int i=serveIndex; i<=orderQueue.peek(); i++) {//서브컨테이너에 넣어줌
        				serveStack.add(i);
        				if(mainQueue.size()>0) {
            				mainQueue.remove();
        				}
        			}
        			serveIndex = orderQueue.peek()+1;
        		}
        	}
        	if(serveStack.size()>orderQueue.size() || orderQueue.size()==0) {//주문내역이 비어있거나 서브컨테이너가 주문내역보다 크면 break;
            	break;
        	}
        }
        
        return answer;
    }
}
This post is licensed under CC BY 4.0 by the author.