Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Algorithm/Leet Code

[leetcode] (Swift) 134 - Gas station (Medium, ๊ทธ๋ฆฌ๋””)

๊ฐ์ž ๐Ÿฅ” 2023. 2. 9. 12:49
๋ฐ˜์‘ํ˜•

 

 

์—ญ์‹œ ๋ฆฌํŠธ์ฝ”๋“œ๋Š”,, ์˜์–ด๋ผ์„œ ๋ฌธ์ œ ์ฝ๊ณ  ์ดํ•ดํ•˜๋Š”๋ฐ ์ข€ ๋” ๊ฑธ๋ฆฐ๋‹ค. ํ•˜ํ•˜ํ•˜ํ•˜ํ•˜ํ•˜ํ•˜ํ•˜ํ•˜ํ•˜
์ฝ๊ณ  ๋ช‡๋ฒˆ์€ ๋” ์ •ํ™•ํ•˜๊ฒŒ ๋‚ด๊ฐ€ ํ•ด์„ํ•œ๊ฒŒ ๋งž๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค.... 

๐ŸŸ  ๋ฌธ์ œ

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

 

Gas Station - LeetCode

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 station to its next (i + 1)th station. You beg

leetcode.com

์˜์–ด์ธ๋งŒํผ ๋ฌธ์ œ๋ฅผ ์กฐ๊ธˆ ์„ค๋ช…ํ•ด๋ณด์ž.

๋ฌธ์ œ์—์„œ๋Š” [Int] ํ˜•์˜ gas ๋ฐฐ์—ด๊ณผ cost๋ฐฐ์—ด ๋‘๊ฐœ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‘๊ฐœ์˜ ๊ธธ์ด๋Š” ๊ฐ™๊ณ , ์ตœ๋Œ€ 10^5๊ธธ์ด๊นŒ์ง€ ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค.

< ๋ฐฐ์—ด์ด ์˜๋ฏธํ•˜๋Š” ๊ฒƒ>
gas[i] ๋Š” i๋ฒˆ์งธ ์ฃผ์š”์†Œ์—์„œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” gas์˜ ์–‘์„ ์˜๋ฏธํ•œ๋‹ค.
cost[i] ๋Š” cost[i]์—์„œ cost[i+1]๊นŒ์ง€ ๊ฐ€๋Š” ๋ฐ ๋“œ๋Š” ๋น„์šฉ (์†Œ๋ชจ๋˜๋Š” ๊ฐ€์Šค์˜ ์–‘)์„ ์˜๋ฏธํ•œ๋‹ค. 

๊ทธ๋Ÿผ 3๋ฒˆ ์ฃผ์œ ์†Œ์—์„œ 4๋ฒˆ์ฃผ์œ ์†Œ๋กœ ๊ฐ€๊ฒŒ ๋˜๋ฉด, 3๋ฒˆ์ฃผ์œ ์†Œ์— ์žˆ๋Š” gas[3]๋งŒํผ ์ฑ„์šฐ๊ณ , cost[3]๋งŒํผ ์†Œ๋น„ํ•˜๊ณ , 4์— ๋„์ฐฉํ•ด์„œ gas[4]๋ฅผ ์ฑ„์šฐ๊ฒ ์ง€?

<๋ฌธ์ œ>
์šฐ๋ฆฌ๋Š” ๊ฒฐ๊ตญ ์‹œ์ž‘์ ์œผ๋กœ ๋Œ์•„์™€์•ผํ•˜๋Š” ๋ฌธ์ œ๋‹ค. 3๋ฒˆ์ฃผ์œ ์†Œ์—์„œ ์—ฌํ–‰์„ ์‹œ์ž‘ํ–ˆ๋‹ค๋ฉด, ๋‹ค์‹œ 3๋ฒˆ์œผ๋กœ ๋Œ์•„์™€์•ผํ•œ๋‹ค. 3,4,5,1,2, ์ด๋ ‡๊ฒŒ! ์šฐ๋ฆฌ๋Š” ์ด ์‹œ์ž‘์ ์„ ์ฐพ์•„์•ผํ•œ๋‹ค.
๊ฐ€์Šค๊ฐ€ ๋ถ€์กฑํ•˜๋ฉด ์›€์ง์ผ์ˆ˜์—†๊ฒ ์ง€? ๊ทธ๋ž˜์„œ ์ ์ ˆํ•œ ์‹œ์ž‘์ ์„ ์ฐพ์•„์„œ ๋ฆฌํ„ดํ•ด์ฃผ๊ณ , ๋งŒ์•ฝ ์‹œ์ž‘์ ์„ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๋ฐฐ์—ด์ด ์ฃผ์–ด์ง„๋‹ค๋ฉด -1์„ ๋ฆฌํ„ดํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค. 

 

๐ŸŸ  ์ฒซ๋ฒˆ์งธ - ๊ด‘๊ธฐ์˜ ํ…Œ์ผ€ ํ†ต๊ณผ ์‹คํŒจ - ์‹œ๊ฐ„์ดˆ๊ณผ!

์•„๋‹ˆ ํ…Œ์ผ€ ์ง„์งœ ์š•๋‚˜์˜ค๋„ค.. ๊ด‘๊ธฐ์•„๋‹ˆ๋ƒ์ด๊ฑฐ! ์–ด์จŒ๋“  ์‹œ๊ฐ„์ดˆ๊ณผ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผํ•œ๋‹ค..(๊ธธ์ด๊ฐ€ xcode์— ๋ถ™์—ฌ๋„ฃ์œผ๋ฉด ๋ฉˆ์ถ”๋Š” ์ •๋„๋กœ ๊ธธ๋‹ค.. 10^5 ๊ธธ์ด๋กœ ๋„ฃ์€๋“ฏ ;)

โŒ ํ‹€๋ฆฐ ์ฝ”๋“œ

class Solution {
    func canCompleteCircuit(_ gas: [Int], _ cost: [Int]) -> Int {
        for startNum in 0..<gas.count {
            var answer = 0
            var isPossibleTravel = true
            // ๋‚ด๋ถ€๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ์ˆœํ™˜ํ•˜๋ฉด์„œ ๋”ํ•ด์ฃผ๊ธฐ
            for idx in startNum..<gas.count+startNum {
                let index = idx % gas.count
                answer += gas[index] - cost[index]

                if answer < 0 {
                    isPossibleTravel = false
                    break
                }
            }

            if isPossibleTravel {
                return startNum
            }
        }

        return -1
    }
}

์ด์ค‘ ํฌ๋ฌธ์„ ์‚ฌ์šฉํ–ˆ๋‹ค. ์ค‘๊ฐ„์— ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ break๋ฅผ ๊ฑธ์–ด์ฃผ๋Š” ์žฅ์น˜๊ฐ€ ์žˆ์ง€๋งŒ ,, 10^5๊ฐ€ ๋“ค์–ด์˜ค๊ณ , ์ €๋ ‡๊ฒŒ 0์ด ๋ฌดํ•œ๋Œ€๋กœ ๋Š˜์–ด์„  ๊ฒฝ์šฐ์— ์–ด์ฉ” ์ˆ˜์—†์ด ๋ช‡์–ต๋ฒˆ์˜ ๋ฐ˜๋ณต๋ฌธ์ด ๋Œ์•„๊ฐ€๊ฒŒ ๋˜๊ฒ ์ง€.. ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(n^2)์œผ๋กœ ๋ณด์ธ๋‹ค. ์ด๊ฒƒ์„ O(n)์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆœ ์—†์„๊นŒ?

โœ… break ์กฐ๊ฑด์„ ์‚ฌ์ „์— ๊ฑธ์–ด์ฃผ๊ณ , ๋ฏธ๋ฆฌ ๊ณ„์‚ฐ์„ ๋–„๋ ค๋ฒ„๋ฆฌ์ž

๋ฌธ์ œ๋ฅผ ๋ณด๋ฉด์„œ ๋Š๋‚€๊ฒŒ, ๊ฒฐ๊ตญ gas[idx] - cost[idx] ๋“ค์˜ ํ•ฉ์ด ๋งˆ์ด๋„ˆ์Šค๊ฐ€ ๋‚˜์˜ค๋ฉด ์•ˆ๋˜๋Š” ๋ฌธ์ œ์˜€๋‹ค. ์ด ๋ถ€๋ถ„์„ ์ฒซ๋ฒˆ์งธ ์‹œ๋„์—์„œ๋Š” ์ „๋ถ€ for๋ฌธ ๋‚ด๋ถ€์—์„œ ๊ณ„์‚ฐํ•ด์ฃผ๋ฉด์„œ ์—ฌ๋Ÿฌ๋ฒˆ ๊ณ„์‚ฐ์„ ์ˆ˜ํ•ดํ•˜๊ฒŒ ํ–ˆ๋‹ค. 10๋งŒ๊ฐœ๊ฐ€ ๋“ค์–ด์˜ค๋ฉด, 10๋งŒ๋ฒˆ์˜ for๋ฌธ์„ ๋Œ๋ฉด์„œ ๊ณ„์†์ ์œผ๋กœ ์—ฐ์‚ฐ์„ ํ•˜๊ฒŒ ๋˜์–ด์žˆ์—‡์ง€... ๊ทธ๋ž˜์„œ ์ด๋ถ€๋ถ„์„ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•˜๊ณ , break๋ฌธ์„ ๊ฑธ์–ด์ฃผ๋ฉด ์–ด๋–จ์ง€ ์ƒ๊ฐํ–ˆ๋‹ค.

// ์ผ๋‹จ ์ฐจ์•ก ๋‹ค ๊ณ„์‚ฐํ•ด
let gasCostArr = (0..<gas.count).map{ gas[$0] - cost[$0] }

// ๋จผ์ € ์•ˆ๋˜๋ฉด ๋‚˜๊ฐ€๋ฒ„๋ ค
if gasCostArr.reduce(0,+) < 0 {
    return -1
}

์ด๋ ‡๊ฒŒ map์„ ์ด์šฉํ•ด์„œ ๋ฏธ๋ฆฌ ์ฐจ์•ก์„ ์ „๋ถ€ ๊ฒŒ์‚ฐํ•ด์„œ ์ƒˆ๋กœ์šด array์— ๋„ฃ์–ด์ฃผ์—ˆ๊ณ , reduce ๊ณ ์ฐจํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋˜ํ•œ ํ•ฉ์„ ๊ตฌํ•ด๋ณด๊ณ , ํ•ฉ์ด ๋งŒ์•ฝ ์Œ์ˆ˜๊ฐ€ ๋˜๋ฉด -1์ด ๋˜๋„๋ก ๋ฆฌํ„ดํ–ˆ๋‹ค. 

โœ… ๊ทธ๋ฆฌ๊ณ  O(n)์ด ๋˜๋ ค๋ฉด for๋ฌธ์„ ํ•œ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•  ์ˆœ ์—†์„๊นŒ?

์šฐ์„  ํฌ๋ฌธ์„ ์ค„์—ฌ์•ผํ–ˆ๋‹ค. ๋ฒ”์œ„๊ฐ€ 10^5๊นŒ์ง€ ์ฃผ์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ์— ์ด์ค‘for๋ฌธ์„ ๋Œ๋ฆฌ๊ฒŒ ๋˜๋ฉด,, ์ตœ๋Œ€ 10์–ต๋ฒˆ์˜ for loop์ด ๋Œ์•„๊ฐ„๋‹ค. ๋ง๋„์•ˆ๋œ๋‹ค... 1์ดˆ์— 1์–ต์ด๋‹ˆ๊นŒ,, 10์ดˆ!?!? ์–ด์šฐ ๋ง๋„์•ˆ๋ผ

์ƒ๊ฐ์ด ํ•„์š”ํ–ˆ๋‹ค... 

1. ๋จผ์ € ์ „์ฒด์˜ ํ•ฉ์ด ๋ฌด์กฐ๊ฑด 0 ์ด์ƒ์ธ๊ฑธ ํ™•์ธํ–ˆ๋‹ค.
2. ์Šคํƒ€ํŠธ์ง€์ ๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ๋”ํ•ด๋‚˜๊ฐ”์„๋•Œ ๋งˆ์ง€๋ง‰ ๋ฒˆํ˜ธ๊นŒ์ง€ ๋„๋‹ฌํ•œ ๊ฒฝ์šฐ, ๊ทธ ํ•ฉ์ด 0๋ณด๋‹ค ํฌ๋ฉด, ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•œ๊ฑฐ๋‹ค! ์™œ๋ƒ๋ฉด, ์•ž์—์žˆ๋Š” ๋ชจ๋“  ์ˆ˜๋ฅผ ๋ชจ์กฐ๋ฆฌ ๋”ํ•˜๋Š” ์กฐ๊ฑด๋„ ๋งŒ์กฑํ•˜๋Š”๊ฑฐ๊ณ , ์•ž์—์„œ ๋ถ€ํ„ฐ ๋”ํ–ˆ์„๋•Œ ์Œ์ˆ˜๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ๋Š” ์‚ฌ์ „์— ์ฐจ๋‹จํ•ด์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ

๊ทธ๋Ÿฌ๋ฉด,, ์•ž์—์„œ ๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ํ•ฉ์„ ํ™•์ธํ•˜๊ณ , ์Œ์ˆ˜๊ฐ€ ๋‚˜์˜ค๋ฉด ๊ทธ์ž๋ฆฌ๋ถ€ํ„ฐ ๋‹ค์‹œ ํ•ฉ์„ ์ƒˆ๋กœ๊ตฌํ•˜๊ณ , ๊ทธ ์ž๋ฆฌ์˜ ์ธ๋ฑ์Šค๋กœ answer๋ฅผ ๊ฐฑ์‹ ํ•ด์ฃผ๋ฉด ๋˜๊ฒ ๊ตฌ๋‚˜..?

 

๐ŸŸ  ์ •๋‹ต์ฝ”๋“œ

for๋ฌธ ํ•œ๋ฒˆ์“ฐ๋Š”๊ฒŒ ๋กœ์ง์ƒ๊ฐํ•˜๋Š”๊ฒŒ ์ƒ๊ฐ๋ณด๋‹ค ์‰ฝ์ง€ ์•Š๋„ค..? ํ ..

class Solution {
    func canCompleteCircuit(_ gas: [Int], _ cost: [Int]) -> Int {
        let gasCostArr = (0..<gas.count).map{ gas[$0] - cost[$0] }

        if gasCostArr.reduce(0,+) < 0 {
            return -1
        }

        var answerIdx = 0
        var sum = 0

        for startNum in 0..<gas.count {
            sum += gasCostArr[startNum]
            if sum < 0 {
    	        // ์—ฌ๊ธฐ์„œ ๋ณด๋ฉด sum์ด ๋งˆ์ด๋„ˆ์Šค๋˜๋Š”์ˆœ๊ฐ„ ๊ทธ๋ƒฅ 0์œผ๋กœ ๊ฐฑ์‹ ํ•ด์„œ ์ƒˆ๋กญ๊ฒŒ ์‹œ์ž‘ํ•ด๋ฒ„๋ฆฌ๊ณ 
	            // answerIdx๋ฅผ ์ง€๊ธˆ์ธ๋ฑ์Šค๋ฐ”๋กœ ๋’ค์—์žˆ๋Š” ์ธ๋ฑ์Šค๋กœ ์˜ฎ๊ฒจ๋ฒ„๋ฆฌ๊ธฐ
                sum = 0
                answerIdx = startNum + 1
            }
        }
        return answerIdx > gas.count ? -1 : answerIdx
    }
}

 

์šฐ์™€ ๋ฆฌํŠธ์ฝ”๋“œ ์งฑ์ข‹๋‹ค.

์ด๋ ‡๊ฒŒ ๋‚ด๊ฐ€ ํ‘ผ ์ฝ”๋“œ์— ๋Œ€ํ•œ runtime๊ณผ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ด ์–ด๋Š์ •๋„์ธ์ง€ ์•Œ๋ ค์ค€๋‹ค. ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ๋ณดํ†ต ์‚ฌ๋žŒ๋“ค๋ณด๋‹ค ์กฐ๊ธˆ ,,, ๋’ค์ณ์ง€์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ๋กœ ๋ดค์„ ๋•Œ๋Š” ๋‚˜์˜์ง€ ์•Š์•˜๋‹ค.

๊ทธ๋Ÿผ ์ง„์งœ ์ดˆ๊ณ ์ˆ˜๋‹˜๋“ค์€ ์–ด๋–ป๊ฒŒ ์งœ๋Š”์ง€ ๊ถ๊ธˆํ•ด์„œ ์‚ดํŽด๋ดค๋‹ค.

์Œ,, ์ฝ”๋“œ์—์„œ ๋‹ค๋ฅธ ์ ์€ cost์™€ gas์˜ ํ•ฉ์„ ๋”ฐ๋กœ๋”ฐ๋กœ ๊ตฌํ•˜๊ณ  ๊ทธ ๋‘˜์„ ๋น„๊ตํ•ด์ฃผ์—ˆ๋‹ค.
๋‚˜๋Š” ์ด ๊ณผ์ •์—์„œ, gas์™€ cost์˜ ์ฐจ๋ฅผ ๋”ฐ๋กœ ๊ณ„์‚ฐ , ๊ทธ๋ฆฌ๊ณ  ๊ทธ ํ•ฉ์„ ๊ณ„์‚ฐํ–ˆ๋‹ค. ์•„๋ฌด๋ž˜๋„ gas์™€ cost์˜ ์ธ๋ฑ์Šค๋ฅผ ๋น„๊ตํ•˜๊ณ , ๊ทธ ์ธ๋ฑ์Šค๋“ค์˜ ์ฐจ์ด๋ฅผ ๋‹ค์‹œ ๋ฐฐ์—ด๋กœ ๋ฆฌํ„ดํ•˜๋Š” map์„ ์‚ฌ์šฉํ•˜๋Š” ๊ณผ์ •์—์„œ ์กฐ๊ธˆ๋” ์‹œ๊ฐ„์ด ๋“ค์ง€ ์•Š์•˜์„๊นŒ?

์—ญ์‹œ๋‚˜ ์ด ์ฝ”๋“œ๊ฐ€ map์„ ์‚ฌ์šฉํ•ด์„œ ๋”ฐ๋กœ ๋ฐฐ์—ด์„ return ํ•œ๊ฒŒ ์•„๋‹ˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ์ ์ธ ์ธก๋ฉด์—์„œ๋„ ๋‚˜์˜ ์ฝ”๋“œ๋ณด๋‹ค ๋” ์ข‹์•˜๋‹ค. ์˜คํ˜ธ,,, ํ’€์ด๊ณผ์ •์€ ๋˜‘๊ฐ™๋‹ค๊ณ  ๋ด๋„ ๋ฌด๋ฐฉํ•œ๋ฐ, ์–ด๋–ป๊ฒŒ ์–ด๋–ค ๊ณ ์ฐจํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์–ด๋–ค ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์งœ๋Š๋ƒ์— ๋”ฐ๋ผ์„œ ์ด๋ ‡๊ฒŒ๋‚˜ ํšจ์œจ์ด ๋‹ฌ๋ผ์ง€๋Š”๊ตฐ.. ์ƒˆ์‚ผ ํ•œ๋ฒˆ.. ๋”... ๋ชธ์†Œ .. ๋Š๋ผ๊ณ  ๋– ๋‚ฉ๋‹ˆ๋‹ค... ๐Ÿซ  ๋ฉ‹์ง€๋‹ค...๊ณ ์ˆ˜๋“ค

๋ฐ˜์‘ํ˜•