문제 링크: 프로그래머스 / 달리기 경주
func solution(_ players:[String], _ callings:[String]) -> [String] {
var currentRanks = players
for player in callings {
if let index = currentRanks.firstIndex(of: player) {
currentRanks.swapAt(index, index - 1)
}
}
return currentRanks
}

firstIndex(of:)의 반복 호출 → O(n) 시간 복잡도callings.count만큼 반복 → 전체 시간 복잡도 = O(n*m)Dictionary<String, Int>를 병행 사용하여 해결import Foundation
func solution(_ players: [String], _ callings: [String]) -> [String] {
var currentRanks = players
var nameToIndex = [String: Int]()
// 초기 맵 구성
for (index, name) in players.enumerated() {
nameToIndex[name] = index
}
for name in callings {
guard let currentIndex = nameToIndex[name], currentIndex > 0 else { continue }
let frontIndex = currentIndex - 1
let frontPlayer = currentRanks[frontIndex]
// 순서 바꾸기
currentRanks.swapAt(currentIndex, frontIndex)
// 인덱스 맵도 함께 업데이트
nameToIndex[name] = frontIndex
nameToIndex[frontPlayer] = currentIndex
}
return currentRanks
}

요즘 APM 업무가 바빠서 알고리즘을 풀 시간도 없다...
사실 업무가 끝나고 해도 되지만, 피곤을 못 이기고 쉬어버리는 탓에 못하는 것(반성해야지)