2023 KAKAO BLIND RECRUITMENT-택배 배달과 수거하기-C++

고동현·2024년 4월 25일
0

PS

목록 보기
19/51

문제바로가기

이번문제는 어렵지 않다.

핵심은 이거다. 일단 제일 먼집부터 방문하는것이다.
왜? 먼집부터 방문해야하냐?

그래야, 만약 먼집에 서 처리를 할 수 있으면 방문을 안해도 되기 때문이다.

그래서 그냥 구현은 문제에서 준 예시처럼 구현하면 된다.

처음에 약간 헷갈린게,
1 ≤ cap ≤ 50
0 ≤ deliveries의 원소 ≤ 50
라고 적혀있어서 무조건 첫번째집은 방문만 하면 그 집에서 배달을 못할 경우는 없다라고 생각했는데, 그건 아니고
cap 2, deliveries4인경우가 있다.

그래서
2,2, [0,0][0,4] 인경우에는
2번째집을 2번방문해야하므로 flag를 세워서 다시 검사해줬다.

#include <string>
#include <vector>
#include <iostream>

using namespace std;

long long solution(int cap, int n, vector<int> deliveries, vector<int> pickups) {
    long long answer = -1;
    for (int i = n-1; i >= 0; --i) {
        int flag = 0;
        if (deliveries[i] > 0 || pickups[i] > 0) {
            flag = i;
            //give box
            int checkbox = 0;
            for (int j = i; j >= 0; j--) {
                if ((checkbox + deliveries[j]) <= cap) {
                    checkbox += deliveries[j];
                    deliveries[j] = 0;
                }
                else {
                    int tmp = cap - checkbox;
                    checkbox = cap;
                    deliveries[j] -= tmp;
                    break;
                }
            }

            //get box
            int getbox = 0;
            for (int j = i; j >= 0; j--) {
                if ((getbox + pickups[j]) <= cap) {
                    getbox += pickups[j];
                    pickups[j] = 0;
                }
                else {
                    int tmp = cap - getbox;
                    getbox = cap;
                    pickups[j] -= tmp;
                    break;
                }
            }
            answer += (i + 1) * 2;
            if (deliveries[flag] > 0 || pickups[flag] > 0) i = flag+1;
        }
    }
    return answer + 1;
}
profile
항상 Why?[왜썻는지] What?[이를 통해 무엇을 얻었는지 생각하겠습니다.]

0개의 댓글