[Swift]ユニフォーム-プログラマーLv 1


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から自分の前後番号に転送されたものを削除する行為を実行している.

使用する概念

  • Set
  • filter(_:)