알고리즘/코딩테스트-Programmers

[Programmers] 택배 배달과 수거하기 Java

kwang2134 2024. 9. 20. 16:51
728x90
반응형
728x90

[Programmers] 택배 배달과 수거하기 2023 KAKAO BLIND RECRUIMENT - LV 2 


접근

  • 구현

풀이

택배 배달과 수거하기라는 문제로 배달해야 하는 택배는 배달하고 수거해야 하는 택배는 수거하는데 최소 이동 거리를 구하는 문제이다. 택배 트럭에는 박스를 실을 수 있는 공간이 정해져 있고 그 공간을 활용해 효율적이게 배달을 하는 게 목표다. 보기엔 굉장히 복잡해 보이지만 몇 줄 안되는 코드로 끝나는 문제이다.

	long answer = 0;
        int deliver = 0;
        int pickup = 0;
        
        for (int i = n - 1; i >= 0; i--) {
            deliver += deliveries[i];
            pickup += pickups[i];

최단 거리를 저장할 정답 변수와 배달이 필요한 개수를 저장할 변수 그리고 수거가 필요한 개수를 저장할 변수를 선언한다.

배열을 순회하며 마지막 인덱스 부터 접근을 하게 되는데 멀리 있는 집부터 필요한 배달과 수거가 몇 개인지를 변수에 넣는다.

	    while (deliver > 0 || pickup > 0) {
                deliver -= cap;
                pickup -= cap;
                answer += (i + 1) * 2; 
            }

반복문을 통해 멀리 있는 집의 배달과 수거가 끝날 때 까지 반복을 진행해 주는데 트럭으로 배달을 갈 때 트럭 용량만큼 택배를 가져올 수 있고 배달이 끝나면 트럭이 비어있기 때문에 트럭 용량만큼 또 박스를 수거해 올 수 있다. 그래서 각각 배달과 수거의 수에서 트럭 용량 만큼을 빼고 왔다 갔다 반복이 필요하기 때문에 거리의 두 배만큼 이동 거리를 늘려주면 문제가 끝이 나게 된다.


전체 코드

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

거의 코드를 60~70줄 가량 짜다 보니 문득 굳이 이렇게 할 필요가 있는 건가 싶어 다 갈아엎고 단순하게 했더니 통과해 버렸다.

728x90