Mac Plus

Hello Swift

프로그래머스-체육복(Swift)

문제 해설(복습)
  • 체육복을 도난당한 학생이 여벌의 체육복이 있는경우가 있다. 중복된값을 제거해주면 더 쉽게 해결할 수 있다.
  • testcase(13, 14 통과못할시)가 추가된거 같은데 lost와 reserve가 정렬되어 있지 않은경우가 있는거 같다.
func solution(_ n:Int, _ lost:[Int], _ reserve:[Int]) -> Int {

    let lostArr = lost.filter { !reserve.contains($0) }.sorted(by: <) /// 예전에는 for문돌면서 remove해줬는데 그럴필요없이 filter와 contains로 쉽게 중복값제거
    var reserveArr = reserve.filter { !lost.contains($0) }.sorted(by: <)
    
    var safe = 0
    for lost in lostArr {
        if reserveArr.contains(lost-1) { /// lost+1 값을 먼저 체크했더니 [2, 4] [1, 3] 3번이 2번에게 체육복을 빌려줘서 count가 하나 줄어든다. 그래서 -1 값부터 체크
            reserveArr.remove(at: reserveArr.firstIndex(of: lost-1)!)
            safe += 1
        } else if reserveArr.contains(lost+1) {
            reserveArr.remove(at: reserveArr.firstIndex(of: lost+1)!)
            safe += 1
        }
    }
    
    return n - lostArr.count + safe /// 전채 학생수에서 - 도난당한 학생수 + 빌린학생수
    
    /// 예전에 풀었던 방법
//     var arr1 = lost
//     var arr2 = reserve
//     var dic: [Int: Int] = [:]
//     var count = 0
    
//     for a in arr1 {
//         if arr2.contains(a), let idx1 = arr1.firstIndex(of: a), let idx2 = arr2.firstIndex(of: a) {
//             count += 1
//             arr1.remove(at: idx1)
//             arr2.remove(at: idx2)
//         }
//     }
    
//     for i in 0..<arr1.count {
//         for j in 0..<arr2.count {
//             if abs(arr1[i] - arr2[j]) == 1 {
//                 if dic[arr2[j]] != 1 {
//                     dic[arr2[j]] = (dic[arr2[j]] ?? 0) + 1
//                     break
//                 }
                
//             }
//         }
//     }
//     let result = n + count - lost.count + dic.keys.count
//     return result 
}