알고리즘/알문풀(백준, 프로그래머스, 코드트리)

[알고리즘] 2023 Kakao Blind 택배 배달과 수거하기 (Java)

ragabys 2024. 1. 24. 20:44

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

프로그래머스 기준 lv2로, 이전에 포스팅한 문제(https://ragabys.tistory.com/32)와 동일한 난이도라곤 하지만

 

내 기준으로는 이 문제가 왜 lv3가 아닌지 모르겠는 정도로 훨씬훨씬 어려웠다..

 

최소한으로 이동하면서 모든 지역을 탐색해야했기에 최대 어느 정도 거리에 위치한 집까지 가야하는지 확인해야했고

 

이를 좀더 쉽게 접근하기 위해 뒤쪽 인덱스부터 접근하여 최대 실을 수 있는 상자의 수에서

 

배달해야하거나 수거해야하는 상자의 수만큼 반복해서 빼면서 0보다 작아질 경우,

 

해당 위치를 왕복해야한다는 의미가 되므로 그만큼의 거리를 더해주는 식으로 구현했다.

 

코드의 길이 자체는 굉장히 짧은 편에 속하고 대부분 뒤쪽 인덱스부터 접근하는 방식에 대해서는 쉽게 떠올렸을 것 같지만,

 

뒤쪽부터 접근하는 방식을 어떻게 구현해야 할 지에 대해 생각을 해내는 게 많이 어려운 문제였다고 생각한다.

 

아마 백준처럼 문제 난이도 기여하는거 있었으면 lv3 주지 않았을까 싶은 문제였다,,

 

 

class Solution {
    public long solution(int cap, int n, int[] deliveries, int[] pickups) {
        long answer = 0;
        int deliver,pickup,check;
        
        deliver = 0;
        pickup = 0;
        
        for(int i=n-1;i>=0;i--){
            if(deliveries[i]!=0 || pickups[i]!=0){
                check=0;
                
                while(deliver<deliveries[i] || pickup<pickups[i]){
                    deliver+=cap;
                    pickup+=cap;
                    check++;
                }
                
                deliver-=deliveries[i];
                pickup-=pickups[i];
                answer+=(i+1)*2*check;
            }
        }
        
        return answer;
    }
}