택배 배달과 수거하기(Lv2)
https://school.programmers.co.kr/learn/courses/30/lessons/150369
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
풀이
이번 문제는 아이디어 문제인 것 같다.
먼저, 끝에서 부터 시작하는 것을 가정했다. 그러면
- 택배를 배달
- 택배를 수거
이렇게 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;
}
}'알고리즘' 카테고리의 다른 글
| [프로그래머스] 광고 삽입- Java (0) | 2025.08.31 |
|---|---|
| [프로그래머스] 양궁대회 - Java (1) | 2025.08.31 |
| [프로그래머스] 숫자 블록 - Java (0) | 2025.08.28 |
| [프로그래머스] 혼자서 하는 틱택토 - Java (0) | 2025.08.27 |
| [프로그래머스] 비밀 코드 해독 - Java (0) | 2025.07.22 |