function movingStuff(stuff, limit) {
// 1. 입력 배열의 순서를 변경하지 않고 복사한 배열을 생성하고 내림차순으로 정렬 (가장무거운 > 가장가벼운)
const sortedStuff = [...stuff].sort((a, b) => b - a);
let leftIdx = 0; // 왼쪽 끝 인덱스(가장 무거운 짐)
let rightIdx = sortedStuff.length - 1; // 오른쪽 끝 인덱스(가장 가벼운 짐)
let count = 0; // 필요한 박스의 수
// 왼쪽 끝 인덱스가 오른쪽 끝 인덱스보다 작을 때까지 반복
while (leftIdx < rightIdx) {
const leftItem = sortedStuff[leftIdx]; // 왼쪽 아이템
const rightItem = sortedStuff[rightIdx]; // 오른쪽 아이템
// 왼쪽 아이템과 오른쪽 아이템을 합쳐서 박스 무게 제한을 넘지 않으면,
// 왼쪽 인덱스를 증가시키고 오른쪽 인덱스를 감소시키면서 필요한 박스의 수를 1 증가시킨다.
if (leftItem + rightItem <= limit) {
rightIdx--;
}
leftIdx++;
count++;
}
// 입력 배열의 길이가 홀수일 경우, 마지막 아이템은 한 개의 박스에 담아야 함
if (leftIdx === rightIdx) count++;
// 필요한 박스의 수를 반환
return count;
}
레퍼런스 코드
function movingStuff(stuff, limit) {
let twoStuff = 0;
// 짐을 무게순으로 오름차순 정렬
let sortedStuff = stuff.sort((a, b) => a - b);
// 가장 가벼운 짐의 인덱스
let leftIdx = 0;
// 가장 무거운 짐의 인덱스
let rightIdx = sortedStuff.length - 1;
while(leftIdx < rightIdx) {
// 가장 가벼운 짐과 무거운 짐의 합이 limit 보다 작거나 같으면 2개를 한번에 나를 수 있다
if(sortedStuff[leftIdx] + sortedStuff[rightIdx] <= limit) {
// 다음 짐을 확인하기 위해 가장 가벼운 짐과 무거운 짐을 가리키는 인덱스를 옮겨주고
// 한번에 2개 옮길 수 있는 개수를 +1 해준다
leftIdx++;
rightIdx--;
twoStuff++;
} else {
// 위 조건에 맞지 않는 경우는 한번에 한 개만 나를 수 있는 경우이기 때문에
// 가장 무거운 짐의 인덱스만 옮겨준다
rightIdx--;
}
}
// 전체 짐의 개수에서 한번에 2개를 나를 수 있는 경우를 빼 주면 총 필요한 박스의 개수를 구할 수 있다
return stuff.length - twoStuff;
}