양갱의 개발 블로그

[프로그래머스] [2025 프로그래머스 코드챌린지 2차 예선] 택배 상자 꺼내기(Java) 본문

코딩테스트/프로그래머스

[프로그래머스] [2025 프로그래머스 코드챌린지 2차 예선] 택배 상자 꺼내기(Java)

연지양갱 2025. 3. 25. 12:37
728x90

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

 

프로그래머스

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

programmers.co.kr

 

상자를 쌓는 방법은 너비에서 오른쪽 위, 왼쪽 위로 지그재그방향으로 상자를 쌓습니다.

위 사진에서 찾으려는 상자와 상자 위에 있는 상자들의 개수를 return

 

 

확인 내용

더보기

// 초기에 생각한 방법(실패)

// 찾는 상자의 위치 (x,y)
// x는 w보다 작음, y는 n/w의 값보다 같거나 작음        
// num을 w로 나누었을 때 
// 몫이 홀수인 경우, 나머지 값은 w의 뒤에서 -
// 짝수인 경우, 나머지 값은 w의 앞에서 +
// 같은 x에서 찾으려는 숫자의 위에 있는 상자들의 개수 = 답
// 모든 박스를 쌓았을 때만 확인하면 됨

 

 

 

 

 

초기 코드(테스트 케이스 실패)

import java.util.Arrays; 


class Solution {
    public int solution(int n, int w, int num) {
        int answer = 0;
      
        if(w == 1) return n-num+1;
        
        int x = num / w;
        int bufy = num % w;
        int y = 0;
        if(x%2 == 1) {
            bufy = num%w;
            y = w-bufy;
        } else {
            y = bufy;
        }
        
        if(bufy == 0) x-=1; // w의 배수인 경우는 -1
        System.out.println(x + "," + y + "," +bufy);
        
        
        
        answer = n/w - x - 1;
        int quotient = n / w; // 몫
        int remainder = n % w; // 나머지
        
        if(quotient % 2 == 1){
            if(w - remainder < y) answer += 1;
        }else{
            if(w - remainder > y) answer += 1;
        }
        if (remainder == 0) answer -= 1; // 배수인 경우도 있음.
        
        // 해당 박스까지 포함
        answer+=1;
        System.out.println(answer);
        
        return answer;
    }
}

진짜 오랜만에 코딩해서 머리가 안 돌아가나봅니다.. 그냥 냅다 이런 박스 위에 있는 값만 찾게 했는데 테스트 케이스에서 점수가 엉망입니다

다시

 

for문으로 돌렸을 때 거꾸로 넣는건 어떻게 해야 하나 고민을 했었는데 바보같았습니다..ㅎ..ㅎ

 

최종 코드

import java.util.Arrays; 


class Solution {
    public int solution(int n, int w, int num) {
        int answer = 0;
        
        // 이중 배열에 데이터를 넣어줌
        // 이중 배열에 높이 계산 : 배수이면 높이만큼, 나머지가 있으면 +1
        // 왼쪽에서 시작할지 말지 확인하는 boolean 값 -> 반대라면 더해서 빼기/더하기 진행
        // 거꾸로 넣어주는 방식 : for문으로 x 인덱스를 증가 시켰기 때문에 다시 감소하는 방식으로 넣어주면 됨.
        int heightbox = n/w;
        if (n%w != 0) heightbox++;
        int x = 0;
        int y = 0;
        int numx=0;
        int numy=0;
        boolean reverse = false;
        int[][] box = new int[heightbox][w];
        System.out.println(x + "," + y + "," +heightbox);
        
        // 박스 채우기
        for (int i=1; i<=n; i++){
            box[y][x] = i;
            if(i==num){
                numx=x;
                numy=y;
            }
            if (reverse){ // 오른쪽부터 시작한 경우 뒤에서 넣어줘야 함
                if(x==0){
                    reverse = false;
                    y++;
                }else {
                    x--;
                }
            } else {
                if(x == w-1) {
                    reverse=true;
                    y++;
                }else {
                    x++;
                }
            }
        }
        
        
        // 꺼내야 하는 박스 개수 찾기
        // x는 고정하고 박스와 박스 위에 있는 박스들만 알면 됩니다.
        System.out.println(numx + "," + numy );
        while(numy<heightbox){
            if (box[numy][numx] != 0){
                answer++;
            }
            numy++;
        }
        
        return answer;
    }
}

이거보다 더 간단하게 6줄로 간단하게 끝내시는 분들도 계십니다

실력이 많이 부족함을 느끼고 꼭꼭 꾸준히 고민해보는 습관을 들어야 겠습니다

 

힌트 참고

https://whwnd5993.tistory.com/165

728x90