프로그래머스 - 택배 상자(Java)
By on February 14, 2024
프로그래머스 - 택배상자(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);
}
}