프로그래머스 코딩 테스트 문제/lv1

프로래머스 Lv1 택배 상자 꺼내기 문제

lys4321 2026. 2. 24. 12:29
  • 프로래머스 Lv1 택배 상자 꺼내기 문제
    • 해당 문제의 난이도 상승 원인
      • 짝수층의 순서가 역순이어서 처리에 혼동을 줌
    • 해당 문제를 해결한 방법
      • 박스들의 최대 x, y 좌표를 구한 후, 특정 박스를 골랐을 때 그 박스가 소속된 x, y 좌표를 구하고 그 좌표 부분의 최상단을 확인하여 최상단에 박스가 있는지 없는지 검사
    • 처음 방식에서 변경한 방식
      • 처음
        • 짝수층의 좌표를 - 로 두어서 검사하려고 하였으나 오히려 더 복잡해지는 상황 발생
      • 변경
        • 전체 좌표를 미리 구하지 않고 최대 x, y 만 구한 후, 박스가 특정되었을 때 그 박스의 좌표와 최상단 만을 검사하도록 함
    • 문제의 핵심
      • 최상단 박스가 한 층을 온전히 이루는지 아니면 일부만 이룰 때 처리법
    • 이 문제의 목적
      • 문제에 '좌표'를 사용하게 끔 유도를 하지만, 실제로는 그러지 않아도 된다는 것을 학습
      • 문제 속에 함정을 파 놓아도 이에 걸리지 않고 방법을 찾을 수 있다는 방법을 알려줌
class TakeOutBox {
    public int solution(int n, int w, int num) {
        int answer = 0;
        int total_row = ((n + w - 1) / w) - 1; // 최상단의 row 좌표 구함
        int num_row = (num - 1) / w; // 목표의 row 좌표(개수) 구함
        int num_col = (num - 1) % w; // 목표의 col 좌표(개수) 구함

        // 정방향, 순방향 조정
        num_col = (num_row % 2 == 0) ? num_col : (w - 1) - num_col;

        for(int r=num_row; r<=total_row; r++){
            int boxCnt = Math.min(w, n - r * w);
            int lastRowCol = (r % 2 == 0) ? boxCnt - 1 : w - boxCnt;

            if(r % 2 == 0){
                if(lastRowCol >= num_col) answer++;
            }else {
                if(lastRowCol <= num_col) answer++;
            }
        }

        return answer;
    }

    public static void main(String[] args) {
        int n = 22;
        int w = 6;
        int num = 8;
        TakeOutBox tob = new TakeOutBox();
        System.out.println("결과 : " + tob.solution(n, w, num));
    }
}