728x90
▶문제 : 코딩테스트 연습 - 택배 배달과 수거하기 | 프로그래머스 스쿨 (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
'프로그래머스 > C' 카테고리의 다른 글
프로그래머스 Level 1 : 문자열 나누기 C언어 (0) | 2023.04.30 |
---|---|
프로그래머스 Level 1 : 바탕화면 정리 C언어 (0) | 2023.03.13 |
프로그래머스 Level 2 : 숫자 카드 나누기 C언어 (0) | 2022.12.19 |
프로그래머스 Level 1 : 가장 가까운 같은 글자 C언어 (0) | 2022.12.19 |
프로그래머스 Level 2 : 우박수열 정적분 C언어 (0) | 2022.11.12 |
댓글