프로그래머스 택배 배달과 수거하기 자바

꾸준하게 달리기~·2023년 7월 26일
0
post-thumbnail

문제는 다음과 같다.
https://school.programmers.co.kr/learn/courses/30/lessons/150369?language=java

풀이는 다음과 같다.

import java.util.*;

class Solution {
    public long solution(int cap, int n, int[] deliveries, int[] pickups) {
        long answer = 0;
        int d_wait = 0;
        int p_wait = 0;
        
        for(int i = n-1 ; i >= 0 ; i--) {
            d_wait += deliveries[i]; 
            //i번째 집까지 갔을때 대기중인 배달건수
            p_wait += pickups[i];
            
            while(d_wait > 0 || p_wait > 0) {
                d_wait -= cap; 
                //얘가 양수이면 아직 i 번째 집에 배달할것이 남았다는것
                //음수이거나 0 이면 충분히 배달 했다는것
                //음수일때 생각해보면, 위의 += deliveries[i] 로직때문에
                //다음 집 가서도 보상 받음
                
                //예를 들어 2, 2 인데 두번째 index 집에서 -= 3이면
                //첫번째 index 집에서는 d가 -1 이기 때문에 1개만
                //배달하면 된다.
                
                p_wait -= cap;
                //얘가 양수이면 아직 i 번째 집에 수거할것이 남았다는것
                answer += 2*(i+1); //길은 왕복이니 2 곱해줌
            }
        }
        
        
        return answer;
    }
}




이거 그냥 그때그떄 알맞은 로직을 사용하는
그리디 알고리즘 문제이다.

처음 풀이는 되게 난잡하게
index1, index2 이런식으로 배달과 수거를 한번 왕복할때 0이 될때까지 해주고,
처음 배달한집 처음 수거한집의 index를 max1, max2로 기록한다음
Math.max(max1, max2)를 사용하여
answer += 해주었다.
해당 풀이로 문제를 풀어도 예외 케이스가 계속 나왔고,

위에서 푼 풀이는
https://www.youtube.com/watch?v=Ie3lvbTylJo
에서 풀이를 보고 풀었다.
진짜 깔끔한 코드와 설명을 듣고, 실력을 더 늘려야겠다고 생각했다.

링크에서 주어진 풀이는,
한꺼번에 -=를 해주며, 양수일때만 배달, 수거 일이 있는거니까
그때 += 2*(i+1)을 해주었다.

어떤 숫자를 깎아주며 진행하고, 해당 숫자의 양수 음수 여부에 따라 결정하는 로직

profile
반갑습니다~! 좋은하루 보내세요 :)

0개의 댓글