요구사항

창고의 택배 상자들은 왼쪽에서 오른쪽 그 다음 층은 오른쪽에서 왼쪽 으로 번갈아가면서 1번부터 차례대로 쌓여 있고

상자를 꺼내기 위해서는 그 상자 위에 있는 모든 상자를 꺼내야 꺼낼수 있다.

특정 상자를 꺼내려고 할때 총 몇개의 상자를 꺼내야 하는지 구하기

 

 

입력 값

int n 창고에 쌓여있는 택배 상자 총 개수
int w 가로로 놓을 수 있는 상자의 개수
int num 꺼내려는 상자의 번호

 

 

풀이

1. 박스 위치 구하기

   -> 박스가 위치한 높이(층)            = (박스번호 - 1) / 가로개수 + 1

   -> 박스가 위치한 가로위치 (1~w) =

           박스가 홀수 층 이면? (박스번호 - 1) % 가로개수 + 1

           박스가 짝수 층 이면? 박스높이 * 가로개수 - 박스번호 + 1

 

2. 꺼내야 하는 박스의 위에 있는 박스 번호 구하기

   -> 위에 있는 박스가 홀수 층이면? 박스 가로위치 * 2 -1

       위에 있는 박스가 짝수 층이면? 가로개수 * 2 - 박스 가로위치 * 2 -1

   -> 꺼내야하는 박스 갯수 + 1 처리

 

3. 2에서 구한 박스가 최대 박스 번호보다 커질 때까지 2 반복하여 위에 있는 박스 구하기

 

4. 꺼내야하는 박스 갯수 return

 

728x90

 

Java 코드

class Solution {
    public int solution(int n, int w, int num) {
        int answer = 0;
        
        // 꺼내야 하는 박스 위치
        int pickH = ((num-1)/w) + 1;
        int pickW = (pickH%2 == 1) ? (num-1)%w+1 : pickH*w-num+1;
        
        int now = num;
        int pickCnt = 0;
        
        while(now <= n) {
            pickCnt++;
            
            if((pickH + pickCnt)%2 == 0) now += w*2 - (pickW*2 - 1);
            else now += pickW*2 - 1;
        }
        
        answer = pickCnt;
        
        return answer;
    }
}

 

 

문제 출처

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

728x90
반응형

+ Recent posts