본문 바로가기

알고리즘 공부 및 문제 풀이/프로그래머스(PRO)

[pro] 프로그래머스 level2 131704 택배 상자 (Java) - 시뮬레이션

[문제]

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

 

프로그래머스

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

programmers.co.kr

 

[풀이]

메인 컨베이어 벨트는 들어온 순서대로 나가기때문에 Queue를 사용하고, 서브 컨베이어 벨트는 가장 늦게 들어온 택배가 가장 빨리 나가므로 Stack를 사용한다.

택배에 실어야 하는 상자 번호가 현재 상자 번호보다 작다면 서브 컨베이어 벨트에 있다는 의미이므로 서브 컨베이어 벨트의 상자들과 비교한다. 그렇지 않다면 메인 컨베이어 벨트에 있다는 의미이므로 메인 컨베이어 벨트의 상자들과 비교해서상자를  이동시켜준다.

 

[코드]

 

import java.util.*;

class Solution {
    public int solution(int[] order) {
        //영재가 몇 개의 상자를 실을 수 있는지 return    
        int answer = 0;
        
        int len = order.length;
        Queue<Integer> main = new LinkedList<>();
        for(int i=1; i<=len; i++){
            main.offer(i);
        }
        
        Stack<Integer> sub = new Stack<>();
       
        int now = 0;
        for(int o:order){
            while(true){
                if(o < now){
                    if(sub.peek()==o){
                        now = sub.pop();
                        answer++;
                        break;
                    }
                    else{
                        return answer;
                    }
                }
                else if(!main.isEmpty()){
                    if(main.peek()==o){
                        now = main.poll();
                        answer++;
                        break;
                    }
                    else{
                        sub.push(main.poll());
                    }
                }
            }
        }
        
        return answer;
    }
}