YataNox
[Java] Lv.2 택배 배달과 수거하기 본문
문제
문제 풀이
스택을 활용한 풀이를 진행했다.
처음부터 마지막 집까지 배달 / 수거해야하는 상자의 개수만큼 각각의 스택에 push한다.
이후 두 스택 중 하나가 빌때까지 cap의 크기만큼 스택을 비우고 두 스택 중 들어있는 집번호 크기가 큰 쪽 * 2를 활용하여 이동거리를 +해준다.
이후 비지않은 남은 스택을 빌때까지 cap수만큼 pop 해주며 이동 거리를 더해준다.
자바 코드
import java.util.*;
class Solution {
private final Stack<Integer> deliver = new Stack<>();
private final Stack<Integer> pickup = new Stack<>();
public long solution(int cap, int n, int[] deliveries, int[] pickups) {
long answer = 0;
// 각 집 별로 배달/수거 해야하는 물건의 수만큼 스택에 추가
for(int i = 0; i < n; i++){
for(int j = 0; j < deliveries[i]; j++){
deliver.push(i + 1);
}
for(int j = 0; j < pickups[i]; j++){
pickup.push(i + 1);
}
}
// 이동거리 구하기
while(!deliver.isEmpty() && !pickup.isEmpty()){
int lastD = deliver.peek();
int lastP = pickup.peek();
// 둘 중 하나가 빌 때까지
// cap수 만큼 배달 and 수거하기
for(int i = 0; i < cap; i++){
if(!deliver.isEmpty())
deliver.pop();
if(!pickup.isEmpty())
pickup.pop();
}
// 이동거리는 가장 멀리 배달 or 수거간 집의 거리 * 2
answer += Math.max(lastD, lastP) * 2;
}
// 남은 배달 혹은 수거를 빌때까지 반복
// 위의 while에서 배달이 먼저 다비면 맨 아래 while문이
// 수거가 먼저 다 비면 바로 아래의 while문이 동작한다.
while(!deliver.isEmpty()){
int last = deliver.peek();
for(int i = 0; i < cap; i++){
if(!deliver.isEmpty())
deliver.pop();
}
answer += last * 2;
}
while(!pickup.isEmpty()){
int last = pickup.peek();
for(int i = 0; i < cap; i++){
if(!pickup.isEmpty())
pickup.pop();
}
answer += last * 2;
}
return answer;
}
}
'코딩 테스트 > PROGRAMMERS' 카테고리의 다른 글
[Java] Lv.2 유사 칸토어 비트열 (0) | 2024.06.13 |
---|---|
[Java] Lv.2 마법의 엘리베이터 (2) | 2024.06.11 |
[Java] Lv2 시소 짝꿍 (2) | 2024.06.11 |
[Java] Lv.2 미로 탈출 (2) | 2024.06.06 |
[Java] Lv.2 혼자서 하는 틱택토 (0) | 2024.06.04 |