코딩테스트

[프로그래머스] 택배 상자 꺼내기 (JS)

여유로운 프론트엔드 개발자 2025. 3. 12. 17:22

문제

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

풀이

(1) 2차원 배열의 행(row) 개수를 계산한다.

  • 주어진 상자 개수(n)와 한 줄에 배치할 수 있는 개수(w)를 이용해 전체 행(row) 수를 구한다.

(2) 택배 상자를 저장할 2차원 배열을 생성하고 0으로 초기화한다.

  • w개의 열을 가진 row개의 행을 만들어, 모든 값을 초기 상태(0)로 채운다.

(3) 짝수 행은 정방향, 홀수 행은 역방향으로 1부터 n까지 순차적으로 저장한다.

  • 상자를 채울 때, 짝수 행은 왼쪽에서 오른쪽(정방향), 홀수 행은 오른쪽에서 왼쪽(역방향) 으로 채운다.
  • 이 과정에서 찾고자 하는 숫자(num)가 등장하면, 해당 열(column) 인덱스를 기록해둔다.
  • n을 초과하는 경우 더 이상 저장할 필요가 없으므로 반복을 종료한다.

(4) 기록해둔 인덱스를 활용해, 해당 열(column)에 있는 값 중 num보다 큰 값의 개수를 구한다.

  • 저장된 행렬에서 num이 위치한 열(column)을 찾아, num 이상의 값이 몇 개인지 계산하여 반환한다.
solution = (n, w, num) => {
    const row = Math.ceil(n / w);
    const box = Array.from({length: row}, () => new Array(w).fill(0));
    let packageIdx = 0;
    let increamentNum = 1;

    for (let i = 0; i < row; i++) {
        for (let j = 0; j < w; j++) {
            if (increamentNum > n) break;

            const col = i % 2 === 0 ? j : w - j - 1;
            box[i][col] = increamentNum;

            if (increamentNum === num) packageIdx = col;
            increamentNum++;
        }
    }

    return box.filter(row => row[packageIdx] >= num).length;
}

결론

2025 프로그래머스 코드챌린지 2차 예선 문제를 풀어보았다.

문제 이해가 쉬워 빠르게 구현할 수 있었다.

'코딩테스트' 카테고리의 다른 글

[백준] 포스택 (JS)  (0) 2025.03.16
[백준] 보물 (JS)  (0) 2025.03.14
[프로그래머스] 유연근무제 (JS)  (0) 2025.03.11
[백준] 국회의원 선거 (JS)  (0) 2025.03.06
[백준] 프린터 큐 (JS)  (0) 2025.03.04