프로그래머스 택배 상자 꺼내기[자력]

작성자 : 조회수 :

 

소요시간 : 3시간

 

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

 

두 가지 문제 풀이가 생각났습니다

 

1번 숫자가 크지 않으니 하나씩 다 적재해서 구현

2번 좌표를 계산해 수학적으로 접근

 

 

2번을 시도하다가 반례 문제를 찾지 못해서 1번으로 선회했습니다

2번에서 2시간 30분정도가 걸렸고 1번으로 접근하니 30분만에 해결했습니다

 




로직

1번 해당 사진을 보고 직접 상자를 다 적재하는 코드를 구현

2번 적재 중 타겟이 되는 상자 숫자가 있으면 좌표를 기억

3번 적재가 모두 완료되면 하나씩 꺼내면서 값을 구하기



직접 적재하는 코드를 손 코딩으로 먼저 설계한 후에 코딩을 했습니다.








구현에 실패했던 손 코딩 흔적 입니다.




 

package Question;

import java.util.Arrays;

public class TakeOutTheDeliveryBox2 {

   
public static void main(String[] args) {
       
System.out.println(solution(100,1,33));
    }

   
public static int solution(int n, int w, int num) {
       
int answer = 0; // 자기 자신 상자를 포함하니 1
       
int boxNumber = n;
       
int box = 1;
       
int h = n/w;
       
if(n%w > 0) h++;

       
// 0 빈공간을 의미
       
int wPoint = 0;
       
int hPoint = 0;

       
// 적재할 공간
        
int[][] boxSpace = new int[h][w];
       
boolean reverseLoad = false;

       
for(int i = 0; i < h; i++){
           
int startPoint = reverseLoad ? w-1 : 0;

           
for (int j = 0; j < w; j++) {

               
if(boxNumber > 0){

                    boxSpace[(h-
1)-i][startPoint] = box;

                   
if(box == num){
                        wPoint = startPoint;
                        hPoint = (h-
1)-i;
                    }

                   
if(reverseLoad) startPoint--;
                    
else startPoint++;

                    box++;
                    boxNumber--;
                }
            }

            reverseLoad = !reverseLoad;
        }

       
//System.out.println(Arrays.deepToString(boxSpace));

        //
위치를 찾았으니 적재위치에서 위로 하나씩 체크
       
for (int i = hPoint; i >= 0 ; i--){
           
if(boxSpace[i][wPoint] == 0){
               
break;
            }
else{
                answer++;
            }
        }

       
return answer;
    }
}

 

 

 

정답코드를 보기 불편하다면 github를 참고해주세요

 

https://github.com/ddpound/DoItAlgorithm/blob/master/src/Question/TakeOutTheDeliveryBox2.java