넘치게 채우기

[Leetcode] 134. Gas Station 본문

PS/LeetCode

[Leetcode] 134. Gas Station

riveroverflow 2023. 4. 29. 18:30
728x90
반응형

https://leetcode.com/problems/gas-station/description/

 

Gas Station - LeetCode

Can you solve this real interview question? Gas Station - There are n gas stations along a circular route, where the amount of gas at the ith station is gas[i]. You have a car with an unlimited gas tank and it costs cost[i] of gas to travel from the ith st

leetcode.com

문제 유형 : 그리디 / 브루트 포스

난이도 : Medium

 

문제

There are n gas stations along a circular route, where the amount of gas at the ith station is gas[i].

You have a car with an unlimited gas tank and it costs cost[i] of gas to travel from the ith station to its next (i + 1)th station. You begin the journey with an empty tank at one of the gas stations.

Given two integer arrays gas and cost, return the starting gas station's index if you can travel around the circuit once in the clockwise direction, otherwise return -1. If there exists a solution, it is guaranteed to be unique.

 

원형으로 된 길에 n개의 주유소가 있다. gas[i]에는 i번째 주유소의 연료의 양이 저장되어 있고, cost[i]에는 i에서 i+1로 갈 때 쓰이는 연료의 양이 저장되어 있다.

연료의 제한이 없는 차의 연료가 없고, 한 바퀴를 돈다고 할 때, 시계방향으로 돌 수 있는 인덱스를 구하시오. (단, 없을 시 -1을 내보낸다.)

 

입력

주유소의 연료량 gas[]와 연료 소모량 cost[]가 주어진다.

n == gas.length == cost.length

1 <= n <= 10^5

0 <= gas[i], cost[i], <= 10^4

 

출력

한 바퀴를 돌 수 있는 인덱스를 반환하고, 없으면 -1을 반환한다.

 

 

문제 풀이

cost[i]가 가장 낮은 것부터 시작점을 잡고 가면 되겠다 라고 생각했다.. 그러나, 이런 방법으로 풀으려니 도저히 구현할 방법이 떠오르지 않았다.

 

문제 예시를 그리면서 보는데, 민트색 글씨가 주유 값과 이동 소모값을 뺀 값이다. 이 값이 양수가 되는 곳에서 시작이 되어야 한다고 생각되었고, 그냥 배열을 한바퀴 돌면서, 음의 값이더라도 누적만 시켜놓고, 이 민트색 값들의 누적이 0보다 작으면 -1을 반환하고, 아니면 시작점을 반환하면 된다고 생각되었다.

 

코드(C++)

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int n = gas.size();
        int tank = 0;
        int sum = 0;
        int location = 0;
        for(int i = 0; i < n; i++){
            tank += gas[i] - cost[i];
            if(tank < 0){
                location = i + 1;
                sum += tank;
                tank = 0;
                }
            }
        sum += tank;
        if(sum < 0){
            return -1;
        }    
        else{
            return location;
        }
    }
};
728x90
반응형

'PS > LeetCode' 카테고리의 다른 글

[LeetCode] 1137. N-th Tribonacci Number  (0) 2023.04.30
[LeetCode] 509. Fibonacci Number  (0) 2023.04.30
[LeetCode] 7. Reverse Integer  (0) 2023.04.30
[LeetCode] 258. Add Digits  (0) 2023.04.27
[LeetCode] 13. Roman to Integer  (0) 2023.04.26