[Swift] 체육복 - 프로그래머스 Lv 1

Ryan (Geonhee) Son·2021년 7월 6일
0

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(_:)
profile
합리적인 해법 찾기를 좋아합니다.

0개의 댓글