로직
아이디어 : 갈때 가장 먼 집부터 택배소 방향으로 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;
}
}
'Algorithm > Practice' 카테고리의 다른 글
Programmers - 연속 펄스 부분 수열의 합 with JAVA (0) | 2023.07.19 |
---|---|
Programmers - 시소짝궁 with JAVA (0) | 2023.07.19 |
Programmers - 순위 검색 with JAVA (V) (0) | 2023.07.15 |
Programmers - 기둥 과 보 설치 with JAVA (0) | 2023.07.10 |
Programmers - 리코쳇 로봇 with JAVA (0) | 2023.07.10 |