본문 바로가기
  • 삽질하는 자의 블로그
CS와 언어, 라이브러리 이론

9. [실전] - 택배상자

by 이게뭐당가 2023. 1. 18.

문제

택배상자를 트럭에 싣는다.
    크기는 모두 같으며, "1번 부터 n번 상자"까지 "번호가 증가하는 순서대로 컨테이너 벨트에 놓여, 영재에게 온다."
    "컨테이너 벨트는 한방향으로만 움직인다".
    상자는 "1번부터 내릴 수 있다"
    "1번부터 내려, 트럭에 싣게되면, 배달순서와 달라져 곤욕을 치른다."
    따라서, "택배기사의 오더에 따라 택배상자를 실어야한다."

    만약 벨트의 맨앞에 놓인 상자가, 현재 실어야 할 상자가 아니라면, "보조 컨테이너 벨트"에 올려둔다.

    보조컨테이너 벨트는 양방향으로 전부 움직이지만, 입구가 하나다.
    즉, "가장 마지막에 벨트에 보관한 상자부터 꺼낼 수 있다."

    "보조 컨테이너 벨트를 이용해도 기사님이 원하는 순서대로 상자를 싣지 못 한다면, 더 이상 상자를 싣지 않습니다."
    
택배기사가 원하는 상자순서인 order 가 주어질때,
영재가 몇개의 상자를 실을 수 있는지 return 하시오.

예시

5개의 상자를 트럭에 실어야 한다.
택배기사님은, 기존의 컨테이너 벨트의 4번째, 3번째, 1번째, 2,번째, 5번째 를 실으라고 한다.
그렇다면 영재는, "1,2,3번 박스를" 순서대로 "보조컨테이너에 보관"
"4번째 박스를 먼저 실어주고", "보조컨테이너에 넣은 3번째 상자를 실어준다."
다음 "1번째 상자를 실어줘야 하지만, 보조컨테이너벨트는 2번째 상자가 막고있기 때문에, 더이상 실을 수 없습니다".

따라서 2개의 상자만 실리게 됩니다.

       order	            result
        [4, 3, 1, 2, 5]	        2   
        [5, 4, 3, 2, 1]	        5

        입출력 예 #1
            문제 예시와 같습니다.

        입출력 예 #2
            모든 상자를 보조 컨테이너 벨트에 모두 넣고, 역순으로 하나씩 빼서 트럭에 싣습니다.

 

프로세스

1. score 가 들어온다 날짜별로             [2] , [2, 10], [2, 10, 3], [2,10,3, 50] ...

2. 날짜별로, 점수를 k 만큼 오름차순 정렬한다. [2], [10,2],  [10,3,2] , [50,10,3] ... k=3 일경우

3.  오름차순 정렬한 것 중에, 최소값만 뽑는다  2   ,2      , 2     ,   3

4.  최소값을 Array에 날짜별로 담는다. [2,2,2,3]

** slice 는 새 배열을 반환하므로 가능한 일이다. splice 는 원본배열을 조작해서 안된다.
** slice 를 처음부터 원하는 위치까지 받기 위해서는 0 부터 "1까지" 해야 "하나", 0부터 2까지 하면 "두개"가 된다.
	0~0 라고 0인덱스를 반환하지 않고 0~1 을 해야 0 인덱스를 반환하는 것이다.

 

사용

1. pop()	- 뒤에서부터 배열 삭제하며 빼기

 

내코드


function solution(order) {
    let con = [];
    let subcon = [];
    let truck = [];

    for (i = order.length; i !== 0; i--) {      // pop 을 써서, 배열을 뒤쪽부터 빼기 위해, con 을 거꾸로 만든다.
        con.push(i);                            //  [ n, n-1, n-2, ... , 1]
    }

    for (let j = 0; j < order.length; j++) {                    //  j 는 실어야 할 박스이다. 만약, j 가 커지는데, 트럭안의 갯수가 늘지 않으면 실패다. = break
        if (con.length === 0 && truck.length !== j) break;      // 실패조건 : "컨테이너 비었는데", "트럭 안의 갯수가 늘어나지않을때 (j 는 늘어나므로)"
        for (let i = 0; i < order.length; i++) {                // j 번째 실어야할 박스일때, 반복한다.
            if (con[con.length - 1] === order[j]) {             // con 의 마지막 부분(con.length -1 )이 order 와 같다면 트럭에 넣고, 다음 상자를 준비한다(break).
                truck.push(con.pop());                          
                break;
            } else if (subcon[subcon.length - 1] === order[j]) {      // subcon 의 마지막 부분이 order 와 같다면 트럭에 넣고, 다음상자를 준비한다.(break)
                truck.push(subcon.pop());
                break;
            } else {
                subcon.push(con.pop());                         // con 도 subcon 도 트럭에 실을 수 없다면, con에서 뒤에 상자를 빼( array.pop() ) subcon 에 넣고 con과 subcon 을 다시 뒤진다. (not break)
            }
        }
    }

    return truck.length;
}

 

'CS와 언어, 라이브러리 이론' 카테고리의 다른 글

4. [실전] - 명예의 전당(1)  (0) 2023.01.18

댓글