์ญ์ ๋ฆฌํธ์ฝ๋๋,, ์์ด๋ผ์ ๋ฌธ์ ์ฝ๊ณ ์ดํดํ๋๋ฐ ์ข ๋ ๊ฑธ๋ฆฐ๋ค. ํํํํํํํํํํ
์ฝ๊ณ ๋ช๋ฒ์ ๋ ์ ํํ๊ฒ ๋ด๊ฐ ํด์ํ๊ฒ ๋ง๋์ง ํ์ธํ๋ ๊ณผ์ ์ด ํ์ํ๋ค....
๐ ๋ฌธ์
https://leetcode.com/problems/gas-station
์์ด์ธ๋งํผ ๋ฌธ์ ๋ฅผ ์กฐ๊ธ ์ค๋ช ํด๋ณด์.
๋ฌธ์ ์์๋ [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 ํ๊ฒ ์๋์๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ์ ์ธ ์ธก๋ฉด์์๋ ๋์ ์ฝ๋๋ณด๋ค ๋ ์ข์๋ค. ์คํธ,,, ํ์ด๊ณผ์ ์ ๋๊ฐ๋ค๊ณ ๋ด๋ ๋ฌด๋ฐฉํ๋ฐ, ์ด๋ป๊ฒ ์ด๋ค ๊ณ ์ฐจํจ์๋ฅผ ์ฌ์ฉํ๊ณ ์ด๋ค ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํด์ ์ฝ๋๋ฅผ ์ง๋๋์ ๋ฐ๋ผ์ ์ด๋ ๊ฒ๋ ํจ์จ์ด ๋ฌ๋ผ์ง๋๊ตฐ.. ์์ผ ํ๋ฒ.. ๋... ๋ชธ์ .. ๋๋ผ๊ณ ๋ ๋ฉ๋๋ค... ๐ซ ๋ฉ์ง๋ค...๊ณ ์๋ค