my study.

Coding Test/Programmers

[프로그래머스] 택배상자, java

fftl 2025. 2. 4. 14:57

- 문제

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

- 풀이

import java.util.*;

class Solution {
    
    //문제를 제대로 읽지 않아 컨테이너 벨트는 1~n순으로 나온다를 파악하지 못한 채로
    //접근해서 시간을 많이 소모했습니다.
    
    //보조컨테이너벨트는 가장 마지막에 보관한 상자를 먼저 꺼낸다 == Stack 사용합니다.
    
    public int solution(int[] order) {
        
        int answer = 0;             //정답을 담아줄 answer입니다.
        int len = order.length;     //order의 크기를 미리 담아 사용합니다.
        
        Stack<Integer> st = new Stack<>();  //보조 컨테이너 벨트 역할을 할 Stack을 만들어줍니다.
    
        
        int idx = 0;    //현재 꺼내야할 택배 번호를 확인하기 위한 idx입니다.
        
        //이제 for문을 통해 1번부터 n번까지 오는 택배상자를 표현합니다.
        for(int i=1; i<=len; i++){
            
            //만약 현재 택배상자가 기사님이 원하는 순번의 택배상자일 경우입니다.
            if(i == order[idx]){
                
                idx++;      //다음으로 원하는 택배상자를 확인해야 하므로 idx를 증가시켜줍니다.
                answer++;   //트럭에 실린 택배상자의 수를 증가시켜줍니다.
                
                //이번 택배상자가 트럭에 실림으로서 보조컨테이너의 택배상자가
                //실릴 수 있는 가능성이 생겼으므로, 확인해줍니다.
                //보조 컨테이너 벨트가 비어있는 경우를 대비해 !st.isEmpty() 조건도 추가해줍니다.
                while(!st.isEmpty() && st.peek()==order[idx]){
                    
                    //while문에 들어왔다는 것은 보조 컨테이너 벨트의 첫번째 상자가
                    //택배기사님이 원하는 택배상자 였다는 의미입니다.
                    
                    //보조 컨테이너 벨트에서 택배상자를 꺼내주고,
                    st.pop();
                    
                    //다음 순번의 택배상자 번호를 확인하기 위해 idx 증가,
                    idx++;
                    
                    //트럭에 실린 택배상자 수를 증가시켜줍니다.
                    answer++;
                }
                
            //이번 택배상자 번호가 꺼내야 하는 택배상자 번호와 일치하지 않는다면,
            } else {
                
                //보조 컨테이너 벨트에 넣어줍니다.
                st.add(i);
            }
            
        }
        
        //답을 반환합니다.
        return answer;
    }
}