Swift로 프로그래머스 체육복 문제를 해결하며 얻은 지식을 정리합니다.
import Foundation
func solution(_ n: Int, _ lost: [Int], _ reserve: [Int]) -> Int {
var losts = Set(lost).subtracting(Set(reserve))
var participants = Set(1...n).subtracting(losts)
let reservables = reserve.filter { !lost.contains($0) }
reservables.forEach {
let previousNumber = $0 - 1 == 0 ? 1 : $0 - 1
let followingNumber = $0 + 1 == 0 ? 1 : $0 + 1
if losts.contains(previousNumber) {
losts.remove(previousNumber)
participants.insert(previousNumber)
} else if losts.contains(followingNumber) {
losts.remove(followingNumber)
participants.insert(followingNumber)
}
}
return participants.count
}
체육복을 도난 당한 lost
배열에서 여분이 없어 수업에 참가할 수 없는 학생들을 losts
로, 그 중 빌리지 않고도 현재 수업에 참가할 수 있는 학생을 participants
로, 체육복의 여벌이 남아 실제로 빌려줄 수 있는 학생들을 reservables
로 정의하였고, reservables
내부의 각 학생들이 자신의 전후 번호에게 넘겨주고 전달 받은 학생이 losts
에서 제거하는 행동을 수행하였습니다.