본문 바로가기
프로그래머스/C

[프로그래머스/C]프로그래머스 Level 2 : 택배 배달과 수거하기 C언어

by starfish22 2023. 1. 16.
728x90

▶문제 : 코딩테스트 연습 - 택배 배달과 수거하기 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

▶코드 작성

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

long long solution(int cap, int n, int deliveries[], size_t deliveries_len, int pickups[], size_t pickups_len) {
    long long answer = 0;
    int d_sum = 0, p_sum = 0;

    for (int i = n - 1; i >= 0; i--) {//뒤부터 반복
        if (deliveries[i] > 0 || pickups[i] > 0) {//두 배열 중 하나라도 있을 때
            d_sum += deliveries[i];//배달할 택배 수 더하기
            p_sum += pickups[i];//수거할 택배 수 더하기
            while (d_sum > 0 || p_sum > 0) {//둘 중 하나라도 남는다면 배달 반복
                answer += i + 1;//배달한 거리
                d_sum -= cap;//트럭으로 실은 만큼 빼기
                p_sum -= cap;//트럭으로 실은 만큼 빼기
            }
        }
    }

    return answer * 2;//왕복한 거리를 구해야 하므로 x2
}

 

▶해석

이 문제는 배달할 택배나 수거할 택배 중 하나라도 남아있는 게 있다면 그 거리를 무조건 왕복해야 한다.

또한 왕복하는 동안 가는 길에 배달을 할 수 있고, 돌아가는 길에 다른 집 수거를 할 수 있다.

이 부분을 표현하기 위해 d_sum, p_sum 변수를 선언하였다.

 

d_sum 변수가 양수라면 i+1번째 집에 배달할 택배가 남아있다는 뜻이고,

음수라면 그다음 가까운 거리의 집으로 넘어가서 택배를 배달해도 된다는 뜻이다.

p_sum 변수도 마찬가지로 양수라면 i+1번째 집에 수거하러 가야 하고,

음수라면 그다음 가까운 거리의 집으로 가서 수거하면 된다.

 

만일 배달해도 더 배달해야 될 때 또는 수거해도 더 수거해야 할 때.

즉, d_sum에서 cap을 빼도 d_sum이 양수, p_sum에서 cap을 빼도 p_sum이 양수라면

while문으로 반복하여 왕복을 해준다.

 

그렇게 i가 감소하는 동안 배열값을 p_sum, d_sum에 더해도

이미 먼 집을 왕복하면서 배달, 수거를 했기 때문에

값이 작다면 계속해서 음수가 나오게 되어 왕복하지 않아도 된다.

728x90

댓글