프로그래머스

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

코 밑 2025. 11. 29. 17:59
Contents

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

 

프로그래머스

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

programmers.co.kr

문제

설명

택배기사님이 택배 상자를 좌우로 와리가리치면서 상자를 아래서부터 위로 쌓으신다

n개의 택배상자를 놓아야 하는데 w만큼 쭉 놓으시고

꺾어서 다시 쭉 쌓고를 반복

다 쌓고 나서 누가 num번째 상자를 빼달라 하면

위에 놓인 상자를 치우고 주신다

이때 상단의 상자를 몇개 치워야 하는지 반환(num번째 상자 포함)

 

  1. 2차원 배열에 정수 담기
  2. num 정수의 위치 찾기
  3. num의 위로 몇개의 정수가 있는지 확인하고 반환

이런식으로 생각을 하고 풀어보았다!!

풀이

/*
 * 프로그래머스 택배 상자 꺼내기
 * 1 ~ n의 정수를 배열에 담음
 * 단 w만큼 놓고 돌리고 또 w만큼 놓고 돌리고 하며 배열에 담는다
 * 다 놓고 담고 나서 num을 꺼내기 위해 위의 정수를 치워야 한다
 * 몇 개를 치워야하는지 반환(num 포함)
 */
class Solution {
    public int solution(int n, int w, int num) {
        int[][] arr = new int[n / w + 1][w];

        // 2차원 배열에 담기
        int turn = 1;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[0].length; j++) {
                // 짝수번째 줄은 반대로 담기
                if (i % 2 == 0) {
                    arr[i][j] = turn;
                } else {
                    arr[i][w - j - 1] = turn;
                }

                turn++;
                // 2중 포문 탈출
                if (turn > n) {
                    break;
                }
            }
            if (turn > n) {
                break;
            }
        }

        int cnt = 0;
        int loc = -100;
        // 디폴트값 0이 들어가기 때문에 0은 배제해야 함
        // num의 위치 검색
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[0].length; j++) {
                // 위치 지정
                if (arr[i][j] == num) {
                    loc = j;
                }
                // 그 위치면 카운트
                if (j == loc && arr[i][j] != 0) {
                    cnt++;
                }
            }
        }

        return cnt;
    }
}

단순히 생각한 기능을 구현에만 집중하고 풀어보았다

배열에 정수를 담는 과정에서

짝수번째 줄은 조건절 내의 [w - j - 1]로 넣어주었다

 

num 위치를 지정해주고 이 위치를 지나면 카운트되게 했다

/*
 * 프로그래머스 택배 상자 꺼내기
 * 1 ~ n의 정수를 배열에 담음
 * 단 w만큼 놓고 돌리고 또 w만큼 놓고 돌리고 하며 배열에 담는다
 * 다 놓고 담고 나서 num을 꺼내기 위해 위의 정수를 치워야 한다
 * 몇 개를 치워야하는지 반환(num 포함)
 */
class Solution {
    public int solution(int n, int w, int num) {
        int[][] arr = new int[n / w + 1][w];

        // 2차원 배열에 정수 담기
        int turn = 1;
        // 카운트, num의 위치
        int cnt = 0;
        int loc = -100;
        // 디폴트값 0이 들어가기 때문에 0은 배제해야 함
        // num의 위치 검색
        // 2중 for문 탈출법
        outer: for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[0].length; j++) {
                // 짝수번째 줄은 반대로 담기
                int col = (i % 2 == 0) ? j : (w - j - 1);
                arr[i][col] = turn;

                // num의 위치 지정
                if (turn == num) {
                    loc = col;
                }
                // 거치면 카운트
                if (col == loc) {
                    cnt++;
                }

                turn++;
                // 2중 포문 탈출
                if (turn > n) {
                    break outer;
                }
            }
        }

        return cnt;
    }
}

2중 for문을 두번씩이나 쓰는 것이 꼴뵈기 싫어서 하나로 합쳤다

원리는 같다

시간은 비슷하게 걸리고 메모리는 더쓴다;;

https://github.com/qTeTp/Algo/tree/main/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4/1/389478.%E2%80%85%ED%83%9D%EB%B0%B0%E2%80%85%EC%83%81%EC%9E%90%E2%80%85%EA%BA%BC%EB%82%B4%EA%B8%B0

 

Algo/프로그래머스/1/389478. 택배 상자 꺼내기 at main · qTeTp/Algo

This is an auto push repository for Baekjoon Online Judge created with [BaekjoonHub](https://github.com/BaekjoonHub/BaekjoonHub). - qTeTp/Algo

github.com

 

 

뿌직