[CDT - Javascript] 프로그래머스 연습문제 @ 택배상자

김현수·2024년 2월 12일
0

cdt

목록 보기
50/51


🖋️ 택배상자


# 문제 설명

택배상자를 트럭에 싣는 일

  • 조건

    • 택배상자는 크기가 모두 같음
    • 1번 상자부터 n번 상자까지 번호가 증가하는 순서대로
      컨테이너 벨트에 일렬로 놓여 영재에게 전달
    • 컨테이너 벨트는 한 방향으로만 진행이 가능
    • 벨트에 놓인 순서대로(1번 상자부터) 상자를 내릴 수 있음

    • 택배 기사님이 미리 알려준 순서에 맞게
      영재가 택배상자를 실어야 함
    • 현재 트럭에 실어야 하는 순서가 아니라면
      그 상자를 트럭에 실을 순서가 될 때까지
      잠시 다른 곳에 보관
    • 보조 컨테이너 벨트를 추가로 설치하여 이 위에 실음
    • 보조 컨테이너 벨트는 앞 뒤로 이동이 가능
    • 입구 외에 다른 면이 막혀 있어서
      맨 앞의 상자만 뺄 수 있음
    • 기사님이 원하는 순서대로 상자를 싣지 못 한다면,
      더 이상 상자를 싣지 않음
  • 매개 변수

    • 택배 기사님이 원하는 상자 순서를 나타내는 정수 배열 order
  • 반환값

    • 영재가 몇 개의 상자를 실을 수 있는지 return

  • 📢 제한사항

    • 1 ≤ order의 길이 ≤ 1,000,000
    • order는 1이상 order의 길이 이하의 모든 정수가 한번씩 등장
    • order[i]는 기존의 컨테이너 벨트에 order[i]번째 상자를
      i+1번째로 트럭에 실어야 함을 의미

  • 📰 입출력 예시

    orderresult
    [4, 3, 1, 2, 5]2
    [5, 4, 3, 2, 1]5



  • CODE

function solution(order) {
   let result = 0;
   const stack = [];
   const items = Array.from({length: order.length}, (_, i) => i+1);
    
   items.forEach((v) => {
      stack.push(v);

      while (stack.length !== 0 && stack.at(-1) === order[result]) {
        stack.pop();
        result++;
      }
   })

  return result;
}

풀이

  • stack 을 통해 solution 구하기

  • stack 을 이용해서 보조 컨테이너 수행
  • 해당 items 만큼 반복문으로 무조건 stack 에 담기
  • stack 의 마지막 순서와 order 순서가 일치할 때
    • stack.pop()
    • result ++



Shift 와 Unshift Or Push 와 Pop

unshift 및 shift 작업은 모두 배열에 있는 
모든 요소의 인덱스를 이동해야 하기 때문에 O(n)이 될 수 있음 

대조적으로, push 와 pop은 일반적으로 O(1)이므로 스택 작업에 
훨씬 더 효율적

shift 와 unshift 는 배열의 시작 부분에 
추가하거나 제거되는 로직이라 기존의 요소들이 
+1 혹은 -1 만큼 인덱스가 이동해서 O(n)
profile
일단 한다

0개의 댓글