본문 바로가기

코딩 테스트/PROGRAMMERS

[Java] Lv.2 택배상자

문제

 

 

프로그래머스

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

programmers.co.kr

 

문제 풀이

스택(서브 컨테이너)을 활용해야하는 문제이다.

1. 메인 컨테이너에서 꺼낼 수 있는 박스가 기사가 원하는 박스(이하 기사 박스)보다 작으면 다른 것을 고려할 필요가 없고 현재 컨테이너의 박스를 서브 컨테이너에 담으면 된다.

2. 메인 컨테이너와 기사 박스가 같다면 정답을 +1 하고 다음 박스를 검사한다.

3. 12를 제외한 상황은 서브컨테이너를 확인해야하는 상황이다.

3-2. 서브 컨테이너에서 꺼낼 수 있는 박스와 기사 박스가 같다면 2와 같이 정답을 +1 처리하고 다음 박스를 검사한다.

4. 서브 컨테이너와 기사 박스도 다르다면 더이상 담을 수 있는 박스가 없다. 종료한다.

자바 코드

import java.util.*;
class Solution{
    private Stack<Integer> subTrailer = new Stack<>();
    
    public int solution(int[] order) {
        int answer = 0;
        int curOrder = 1;
        int p = 0;
        while(true){
            if(p == order.length)
                break;
            // 현재 메인 컨테이너 택배보다 기사가 원하는 택배 번호가 더 크면
            // 서브 컨테이너에 현재 택배를 넣고 스킵
            if(curOrder < order[p]){
                subTrailer.add(curOrder++);
                continue;
            }
            
            // 현재 메인컨테이너의 택배와 기사가 원하는 택배가 같으면
            // 꺼내고 다음
            if(curOrder == order[p]){
                curOrder++;
                answer++;
                p++;
                continue;
            }
            
            // 기사가 원하는 택배보다 메인 컨테이너 박스가 더 큰 상황
            // 서브 컨테이너를 확인하고 여기도 없으면 종료
            if(subTrailer.isEmpty())
                break;
            else {
                // 서브 컨테이너 박스가 기사가 원하는 택배와 같으면
                // 꺼내고 다음
                if(subTrailer.peek() == order[p]){
                    subTrailer.pop();
                    p++;
                    answer++;
                    continue;
                }else{ // 여기도 다르면 종료
                    break;
                }
            }
        }
        
        return answer;
    }
}