본문 바로가기
알고리즘

[프로그래머스] 택배 배달과 수거하기- Java

by 2won2 2025. 9. 2.

택배 배달과 수거하기(Lv2)

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

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

 

풀이

이번 문제는 아이디어 문제인 것 같다.

먼저, 끝에서 부터 시작하는 것을 가정했다. 그러면

  1. 택배를 배달
  2. 택배를 수거

이렇게 2가지로 나누어진다.
1번의 경우, 택배를 배달하고, 이후 수거를 하면 되므로 (수거 Cnt)에 cap을 더한다
2번의 경우, 택배를 수거하면, 이전에 배달을 하면서 오면 됐으므로 (배달 Cnt)에 cap을 더한다.

 

그 다음으로 배달을 해야하는 경우엔, 배달Cnt를 확인하고 배달Cnt보다 deliveries[i]가 더 크다면 다시 i까지 와야 하는 상황이된 것이므로, answer에 i+1를 해준다. 이후, 그 차이만큼을 배달Cnt로 갱신하고, 수거Cnt에도 똑같이 더해준다.


마지막으로 수거Cnt도 배달과 마찬가지로 계산해준 후 마지막에 answer*2(왔다 갔다)를 return 했다.

 

 

 

전체 Code

class Solution {
    public long solution(int cap, int n, int[] deliveries, int[] pickups) {
        long answer = 0;
        // sub 갯수를 들고다니자
        int subD = 0;
        int subP = 0;
        for(int i=n-1; i>=0; i--){
           // 현재 배달할 택배의 갯수가 subD보다 큰 경우 다시 방문해야 함
           if(deliveries[i]>subD){
               int cnt = deliveries[i] - subD;
        	   // 몇 번 방문할 것인가	
               int k = cnt%cap==0 ? cnt/cap : cnt/cap+1;
               answer+=((i+1)*k);
               subD = cap*k-cnt;
               // 수거에도 똑같이 더해준다
               subP+=(cap*k);
           }else{
               subD-=deliveries[i];
           }
           if(pickups[i]>subP){
               int cnt = pickups[i] - subP;
               
               int k = cnt%cap==0 ? cnt/cap : cnt/cap+1;
               answer+=((i+1)*k);
               subP = cap*k-cnt;
               subD+=(cap*k);
           }else{
               subP-=pickups[i];
           }
        }
        return answer*2;
    }
}