공부기록

134. Gas Station 본문

코테/LeetCode

134. Gas Station

코타쿠 2021. 6. 6. 19:56

문제

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

코드

class Solution:
    def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:

        if len(gas) == 1:
            if gas[0]-cost[0] < 0:
                return -1
            else:
                return 0

        left_gas = [0 for _ in range(len(gas))]
        presum = [0 for _ in range(len(gas)+1)]

        tot = 0
        for i in range(len(gas)):
            left_gas[i] = gas[i]-cost[i]
            tot += left_gas[i]

        if tot < 0:
            return -1

        for i in range(len(left_gas)):
            presum[i+1] = presum[i] + left_gas[i]


        min_val = 0
        min_idx = 0

        for i in range(len(presum)):
            if min_val > presum[i]:
                min_val = presum[i]
                min_idx = i

        return min_idx

피드백

  • 힘든 취준와중에 자존감 충전용으로 포스팅한다.
  • 알고리즘은 다음과 같다.
    • 다음 주유소로 가면서 얻는 기름, 부족한 기름양은 gas[i] - cost[i]다.
    • 모두 합해서 음수가 나오면 한 바퀴 돌 수 가 없다.
    • 이것들을 구간합한다.
    • 대충 다음과 같은 그래프를 얻게된다.
    • 가장 작은 값을 가지는 항목의 인덱스가 답이다.
  • 가장 작은 값을 가지는 항목이 답인 이유는 다음과 같다.
    • 빨간 줄처럼, 즉 y=0에 평행하게 여러 개의 줄을 그어보자.
    • 그리고 그 줄에 교차하는 그래프의 점을 출발점이라고 생각하자.
    • 그러면, 그래프가 음수가 되면 더 이상 여행을 할 수 없게 된다. 기름이 없으니까.
    • 결국 계속해서 기름이 있으려면, 가장 작은 값에서 부터 출발해야 기름이 0 이상을 가지고 그러면 계속해서 순환할 수 있는것이다.
    • 따라서 가장 작은 값을 가지는 항목의 idx가 답이 된다.

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

1626. Best Team With No Conflicts  (0) 2022.03.06
202. Happy Number  (0) 2022.02.28
97. Interleaving String  (0) 2021.06.04
395. Longest Substring with At Least K Repeating Characters  (0) 2021.06.01
Next Permutation  (0) 2021.05.29