프로그래머스 - 택배 상자(Java)


프로그래머스 - 택배상자(Java)

문제 링크 : 택배 상자


문제 해결 접근법

이번 문제는 문제를 이해 하는데 많은 시간을 사용 해야 했다.
아래 주의 사항만 잘 이해 하면 Stack 을 이용 해서 간단히 해결 할 수 있다.

주의
문제 에서 주어진 Order 는 택배 기사 님이 차에 실어 달라는 택배의 순서 이다.
메인 컨테이너 벨트는 1 번 박스 부터 순서 대로 온다.


소스

public class 택배상자 {

    public int solution(int[] order) {
        int answer = 0;
        int orderIdx = 0;
        Stack<Integer> subBelt = new Stack<>();

        //메인 컨테이너 벨트 For문. 1번부터 order 갯수 만큼 박스를 발생 시킨다.
        for(int i = 1; i <= order.length; i++){
            if(i == order[orderIdx]){
                //i 번째 박스가 order[orderIdx] 의 숫자와 동일하면 택배 기사님이 요청한 순서가 맞으므로 박스를 실고 orderIdx를 증가시킨다.
                answer++;
                orderIdx++;
            }else{
                //i 번째 박스가 order[orderIdx] 가 아니면.
                //서브 벨트에 박스가 없다면 박스를 서브 벨트에 보관 한다.
                if(subBelt.isEmpty()){
                    subBelt.push(i);
                    continue;
                }
                //서브 벨트가 박스가 있으면 서브 벨트에서 박스를 꺼내어 택배 기사님이 요청한 순서의 박스가 있는지 찾아 소모 시킨다.
                while (!subBelt.isEmpty()){
                    if(subBelt.peek() != order[orderIdx]){
                        break;
                    }
                    subBelt.pop();
                    answer++;
                    orderIdx++;
                }
                subBelt.push(i);
            }
        }

        //서브 컨테이너 벨트에 남은 박스를 소모한다.
        while (!subBelt.isEmpty()){
            if(subBelt.peek() != order[orderIdx]){
                break;
            }
            subBelt.pop();
            orderIdx++;
            answer++;
        }
        return answer;
    }

    @Test
    void 택배상자(){
        Assertions.assertThat(solution(new int[]{4,3,1,2,5})).isEqualTo(2);
        Assertions.assertThat(solution(new int[]{5,4,3,2,1})).isEqualTo(5);
        Assertions.assertThat(solution(new int[]{2, 1, 4, 3, 6, 5, 8, 7, 10, 9})).isEqualTo(10);
    }
}

Back to blog