문제
택배상자를 트럭에 싣는다.
크기는 모두 같으며, "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 |
---|
댓글