ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 LV1 - 택배 상자 꺼내기
    STUDY/ALGORITHM 2025. 2. 17. 22:22

    내가 느끼기에, 프로그래머스의 문제들의 난이도가 같은 단계 내에서도 너무 상이하다.

    0문제같은 1단계도 있는 반면에 2단계같은 1단계도 있다.

    이 문제는 나름 1단계가 맞는거같긴 하다만, 깨나 애먹었다.

     

    처음엔 이런식으로 접근했다.

        public void solution(){
    
            int n = 13;
            int w = 3;
            int num = 6;
    
            width = w;
    
            boolean currentDirection = true;
            int answer = 1;
            int offset = getOffset(num);
    
            while (true){
                num += w;
                if(currentDirection) num += offset;
                else num -= offset;
                if(n < num) break;
    
                answer ++;
                currentDirection = !currentDirection;
                
            }
    
            System.out.println(answer);
    
    
        }
    
        private int getOffset(int num){
            int mod = (num % width);
            int offset = -(width - 1);
            int range = isReversed(num)? width - mod : mod;
            for (int i = 0; i < range; i++) {
                offset +=2;            
            }
    
            return offset;
        }
    
        private boolean isReversed(int num){
            return (num / width + 1) % 2 == 0;
        }

     

    인덱스에 따라 offset을 만들어두고, num에서 offset에 따라 값을 보정한다.

    시작을 정방향으로 보고, 다음층 부터 역방향 정방향을 번갈아가며 offset을 더했다 뺀다.

    정확히 어떤경우인지를 모르겠으나 일부 테스트에 실패했다...

     

    아무리 생각해도 더 심플 한 해결방법이 있을것 같다는 생각이 떠나질 않았다.

    그래서 모든 층을 정방향으로 취급하고, 각 층의 인덱스만 좌우대칭으로 번갈아가며 바꿔보기로 한다.

    public void solution(){
    
        int n = 22;
        int w = 6;
        int num = 8;
    
        int answer = 0;
        while (num <= n) { // num은 반드시 n보다 커야함.
    
            int index = (num - 1) % w; // 현재 num의 인덱스
            int diff = w - 1 - index; // 대칭이 되는 위치
    
            num += 2 * diff + 1; // 대칭이 되는 위치로 이동.
            answer ++;
        }
        System.out.println(answer);
    }

     

    말도안되게 간단해졌다. 현재 인덱스를 기준으로 좌우대칭인 인덱스를 찾고, 그 인덱스까지 갈 수 있는 값을 계산한다.
    이리하여 훨씬 간단하게 마무리 됐다.

    한번에 떠올려내진 못했지만, 시행착오를 거쳐 작은 단계의 해결부터 찾았다.

    그리고 그 작은 단계를 통해 점화식을 완성하는데 성공했다.

    직관으로 볼땐 복잡했던 문제를, 분석을 통해 간단히 도식화 하는게 참... 이 맛이 알고리즘 맛이 아닐까?

Designed by Tistory.