[programmers/js] 택배 상자 꺼내기

승민·2025년 3월 10일

알고리즘

목록 보기
145/171

택배 상자 꺼내기

https://school.programmers.co.kr/learn/courses/30/lessons/389478

문제 설명

1 ~ n의 번호가 있는 택배 상자들을 다음과 같이 정리했습니다.

위 그림은 w = 6일 때 택배 상자 22개를 쌓은 예시입니다.
다음 날 손님은 자신의 택배를 찾으러 창고에 왔습니다. 당신은 손님이 자신의 택배 상자 번호를 말하면 해당 택배 상자를 꺼내줍니다. 택배 상자 A를 꺼내려면 먼저 A 위에 있는 다른 모든 상자를 꺼내야 A를 꺼낼 수 있습니다. 예를 들어, 위 그림에서 8번 상자를 꺼내려면 먼저 20번, 17번 상자를 꺼내야 합니다.

당신은 꺼내려는 상자 번호가 주어졌을 때, 꺼내려는 상자를 포함해 총 몇 개의 택배 상자를 꺼내야 하는지 알고 싶습니다.

창고에 있는 택배 상자의 개수를 나타내는 정수 n, 가로로 놓는 상자의 개수를 나타내는 정수 w와 꺼내려는 택배 상자의 번호를 나타내는 정수 num이 매개변수로 주어집니다. 이때, 꺼내야 하는 상자의 총개수를 return 하도록 solution 함수를 완성해 주세요.

풀이

문제의 제한 사항을 확인해보면 숫자가 그렇게 크지 않아 직접 배열을 만들어서 풀 수 있습니다.
우선 w 수의 배열을 생성합니다. 그리고 w만큼 값을 추가하면 배열을 뒤집어 역순으로 들어가게합니다.

이때, 값을 다 추가한 배열의 최대 높이(arr[i].length)가 홀수면 다시 뒤집어 1부터 들어간 배열로 만들어줍니다.

function solution(n, w, num) {
    if (w === 1) return n - num + 1;

    const arr = Array.from({length: w}, () => []);
    const h = Math.trunc(n / w);
    for (let i = 1; i <= n; i++) {
        const r = i % w;
        if (!r) arr[w - 1].push(i)
        else arr[r - 1].push(i);
        if (!r) arr.reverse();
    }
    
    if (h % 2) arr.reverse();
    
    for (let i = 0; i < w; i++) {
        if (arr[i].includes(num)) return arr[i].length - arr[i].indexOf(num);
    }
    
}

0개의 댓글