728x90
내가 느끼는 전형적인 그리디 문제이다.
주어진 상황을 고려했을때 가장 최선의 선택이 무엇인지 고르는 것.
이 문제도 그렇다. 현재 상황에서 가장 좋은 선택이 어느 idx에서 시작이고 그렇게 출발했다면 그 다음 과정도 성립이 되는가를 확인하고 만약 되지 않는다면 다시 상황을 바꿔서 같은 작업을 반복해주면 된다.
이 문제를 풀면서 생각한 논리적 흐름은
- 먼저 가스와 코스트를 각각 전부 더해본다.
- 문제 자체가 시계방향으로 한바퀴를 전부 돌아야하기 때문에 Totally Gas가 Cost보다 작다면 문제 자체가 성립되지 않는다.
- 따라서 이를 먼저 걸러주어 return -1 해준다.
- 이 과정을 통과했다면 for문과 enumerated를 사용해 idx 별로 gas를 얼마나 축적할 수 있고 i + 1의 목적지까지 사용되는 cost가 얼마인지 확인하여 누적한다.
- 이 때 만약 currentGas가 currentCost보다 적어지면 위치를 잘못잡았다는 뜻이기에 다시 인덱스 설정을 해주고 currentGas, currentCost 전부 초기화해준다.
- 이를 반복한다.
* 코드
class Solution {
func canCompleteCircuit(_ gas: [Int], _ cost: [Int]) -> Int {
let totalGas = gas.reduce(0, +)
let totalCost = cost.reduce(0, +)
var ans = 0
var currentGas = 0
var currentCost = 0
if totalGas < totalCost {
return -1
}
for (i, idxGas) in gas.enumerated() {
let idxCost = cost[i]
currentGas += idxGas
currentCost += idxCost
if currentGas < currentCost {
ans = i + 1
currentGas = 0
currentCost = 0
}
}
return ans
}
}
정리(Today I Learned)
- 전형적인 그리디라는 느낌이 들었다. 리트코드는 영어라서 뭔가 좀 어색하지만... 예시가 명확하게 나와있어 다행이다. 하지만 항상 예시만 보고 문제를 푸는 버릇은 아주 작은 단서들을 무시하고 지나갔다가 나중에 깨닫는 경우를 만들기에... 이를 주의해야겠다.
'TIL > 알고리즘 공부' 카테고리의 다른 글
백준 14716번 Swift 알고리즘 연습 - 현수막_BFS (1) | 2023.02.22 |
---|---|
백준 3184번 Swift 알고리즘 연습 - 양_BFS (0) | 2023.02.20 |
LeetCode Swift - 611. Valid Triangle Number_Greedy (0) | 2023.02.09 |
프로그래머스 Lv. 2 Swift 알고리즘 - 구명보트_그리디 (0) | 2023.02.06 |
백준 1931번 Swift 알고리즘 연습 - 회의실 배정_그리디 (0) | 2023.02.06 |