본문 바로가기

Algorithm/Practice

Programmers - 택배 배달과 수거하기 with JAVA

 

 

 

 

로직

아이디어 : 갈때 가장 먼 집부터 택배소 방향으로 Cap 만큼 택배를 전달한다.(가장 먼 곳을 먼저 빨리 전달하고 더 이상 안가겠다는 마인드), 수거시에도 마찬가지로 가장 먼곳부터 비우겠다는 마인드로 택배를 가져온다.

 

1. deliveries, pickups의 값들 중 가장 인덱스가 높으면서 0이아닌 인덱스를 구한다. -> p_index, d_index

(초기값은 -1, -1로 정할 것 -> 모두 0일 수도 있기 때문에)

2. (둘 중 높은 인덱스 + 1) * 2를 answer에 더해준다. -> 이 곳 부터 방문하므로

3. deliveries와 pickups 각각 가장 먼곳부터 Cap만큼 전달 및 수거를 처리한다.

4. 둘 중 하나의 인덱스가 하나라도 -1이 아니라면 2번부터 계속 반복한다.

 

 

 

코드 1 

class Solution {
    public long solution(int cap, int n, int[] deliveries, int[] pickups) {
        long answer = 0;
        int d_index = -1;
        int p_index = -1;
        for(int i=n-1; i>=0; i--){
            if(deliveries[i] != 0){
                d_index = i;
                break;
            }
        }
        for(int i=n-1; i>=0; i--){
            if(pickups[i] != 0){
                p_index = i;
                break;
            }
        }
        while(p_index >= 0 | d_index >= 0){
            answer += 2*Math.max(p_index+1, d_index+1);
            d_index = indexing(d_index, deliveries, cap);
            p_index = indexing(p_index, pickups, cap);
        }
        return answer;
    }
    public static int indexing(int index, int[] list, int cap){
    	// 인덱스가 0이하라면 이미 모두 배달 혹은 수거가 완료됐다는 의미
        if(index < 0){
            return -1;
        }
        for(int i=0; i<cap; i++){
            list[index] -= 1;
            while(list[index] == 0){
                if(index == 0){
                    return -1;
                }
                index -= 1;
            }
        }
        return index;
    }
}

 

 

코드 2

아래 코드를 작성할 때, start = 0으로 처리했고(시작부분과 while문 안에서) 0일때 종료를 시켜버리면 인덱스 0 자리에 택배가 남아있어도 종료를 시켜버린다. 따라서 -1로 설정한다.

class Solution {
    public long solution(int cap, int n, int[] deliveries, int[] pickups) {
        long answer = 0;
        int start = -1;
        for(int i=n-1; i>=0 ; i--){
            if(deliveries[i] != 0 | pickups[i] != 0){
                start = i;
                break;
            }
        }
        while(true){
            int d = cap;
            int p = cap;
            for(int i=start; i>=0; i--){
                deliveries[i] -= d;
                if(deliveries[i] >= 0){
                    break;
                }
                else{
                    d = -deliveries[i];
                    deliveries[i] = 0;
                }
            }
            for(int i=start; i>=0; i--){
                pickups[i] -= p;
                if(pickups[i] >= 0){
                    break;
                }
                else{
                    p = -pickups[i];
                    pickups[i] = 0;
                }
            }
            answer += 2*(start+1);
            int new_start = -1;
            for(int i=start; i>=0; i--){
                if(deliveries[i] != 0 | pickups[i] != 0){
                    new_start = i;
                    break;
                }
            }
            if(new_start == -1){
                break;
            }
            start = new_start;
        }
        return answer;
    }
}