[Leetcode/C++] 134_Gas Station

이수진·2022년 2월 10일
0
post-custom-banner

문제는 다음과 같습니다.

이 문제를 두 가지 방법으로 풀었는데,
처음 풀었던 풀이는 시간초과가 난 풀이입니다.
풀이는 다음과 같습니다.

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int start_idx=-1;
        int n = gas.size(); int cnt=0;
        vector<int> gas_copy = gas; vector<int> cost_copy = cost;
        gas.insert(gas.end(), gas_copy.begin(), gas_copy.end());
        cost.insert(cost.end(), cost_copy.begin(), cost_copy.end());
        
        for(int i=0; i<n; i++){
            if(gas[i]<cost[i]) continue;
            
            int sum = gas[i];
            int j;
            for(j=i; j<i+n; j++){
                if(cost[j]>sum) break;
                sum += (-cost[j] + gas[j+1]);
            }
            if(j==i+n){
                start_idx=i;
                break;
            }
        }
        
        return start_idx;
    }
};

이 방식은
시작점을 찾고 시작점을 기준으로 n만큼 돌기 때문에
총 시간복잡도는 O(n^2)입니다.

O(n)으로 풀어야 시간초과가 안 나는것 같아서
다시 풀었습니다.

풀이는 다음과 같습니다.

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int start_idx=0;
        int n = gas.size(); int sum=0;
        
        int gas_sum = accumulate(gas.begin(), gas.end(), 0);
        int cost_sum = accumulate(cost.begin(), cost.end(), 0);
        if(cost_sum > gas_sum) return -1;
        
        for(int i=0; i<n; i++){
            sum += gas[i]-cost[i];
            if(sum<0){
                start_idx=i+1;
                sum=0;
            }
        }
        return start_idx;
    }
};

저는 입력받은 gas, cost의 벡터의 총 합을 구해 먼저 비교함으로써,
애초에 "cost의 합이 > gas의 합" 인 경우를 먼저 처리했구요,

이 뒤부터는 시작하는 인덱스만 구하면 되기 때문에,
여행을 하면서 드는 경비인 gas[i]-cost[i]를 sum변수에 누적해서 더한 뒤에,

이 sum이 0 이상이면 계속해서 i값을 갱신해나가고,
sum이 음수이면, 시작인덱스를 i+1로 갱신을 하여 이후의 i부터 누적해서 sum에 더하도록 하였습니다.

profile
꾸준히, 열심히, 그리고 잘하자
post-custom-banner

0개의 댓글