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

바그다드·2023년 10월 20일
0
post-thumbnail

문제


풀이

public class Pro_택배배달과수거 {

    public long solution(int cap, int n, int[] deliveries, int[] pickups) {
        long answer = 0;
        int del = 0;
        int pick = 0;
        // 맨 마지막 집부터 시작
        for (int i = n-1; i >= 0; i--) {
            // 만약 현재 집에 배달이나 수거를 할 상자가 있다면
            if (deliveries[i] > 0 || pickups[i] > 0) {
                // 현재 집에 방문해야할 횟수를 누적할 변수
                int cnt = 0;
                // 배달,수거 상자 개수가 현재 집의 배달,수거 개수보다 커질때까지 반복
                // 이건 현재 집에 방문해야 하는 횟수를 측정하기 위함임
                while (del < deliveries[i] || pick < pickups[i]) {
                    // 현재 집 방문 횟수 카운트
                    cnt++;
                    // 현재 집에 배달,수거 가능한 상자의 개수를 누적
                    // 한번의 방문당 배달, 수거 가능한 최대 개수는 cap만큼 가능
                    del += cap;
                    pick += cap;
                }
                // 현재 집에 배달,수거를 한 이후
                // 물류센터로 돌아가지 않고 추가로 배달,수거를 할 수 있는 상자의 개수를 측정
                del -= deliveries[i];
                pick -= pickups[i];
                // 이동거리 계산
                answer += (i+1) * cnt * 2;
            }
        }
        return answer;
    }
}

리뷰

처음에는 방문을 해야 할 최대 거리의 집을 갱신하면서 반복문을 돌려야 하나 생각을 했다.
하지만 이럴 경우 반복문을 여러번 돌려야하고, 방문해야할 최대 거리의 집을 갱신해야 하는 문제도 있었다.
이 문제는 시간 초과 발생으로 다른 사람의 풀이를 참고하고 분석하는 식으로 진행하였다.

전체적인 흐름은 한번의 반복문을 돌면서
현재 위치의 집에 몇번 방문해야 하는지 횟수를 누적하고,
현재 집에서 배달,수거하고 남은 배달,수거 가능한 상자의 개수를 기록하면서 이동한 총 거리를 계산하는 방식이다.

profile
꾸준히 하자!

0개의 댓글