[Algorithm] 프로그래머스 체육복

Updated:

문제 설명

25

나의 풀이

import Foundation
func solution(_ n:Int, _ lost:[Int], _ reserve:[Int]) -> Int {
    var reallyReserve: [Int] = []
    var reallyLost: [Int] = []
    
    for student in lost {
        if !reserve.contains(student) {
            reallyLost.append(student)
        }
    }
    
    for student in reserve {
        if !lost.contains(student) {
            reallyReserve.append(student)
        }
    }
    
    var checkDic = [Int: Bool]()
    
    for i in 0...n+1 {
        if reallyReserve.contains(i) {
            checkDic[i] = true
        }
        else {
            checkDic[i] = false
        }
    }
    
    var count = 0
    for student in reallyLost {
        if checkDic[student+1]! {
            count += 1
            checkDic[student+1] = false
        }
        else if checkDic[student-1]! {
            count += 1
            checkDic[student-1] = false
        }
    }
    
    return n - reallyLost.count + count
}

고민한 점

실제로 배열에서 지워줄까 아니면 dictonary를 만들어서 체크해줄까 라는 고민을 했으며 후자로 구현해보았다. 이때 학생의 번호가 1번이거나 n번일때에도 오류가 나지 않게 하기 위해서 Dictionary의 초기값을 설정할 때 범위를 0부터 n+1까지 false로 해주었다.

괜찮은 남의 풀이

import Foundation
func solution(_ n:Int, _ lost:[Int], _ reserve:[Int]) -> Int {    
    var losted = lost.filter{!reserve.contains($0)}
    var reserved = reserve.filter{!lost.contains($0)}

    var ans = n - losted.count

    for i in 0..<losted.count {
        var has: Int?

        for j in 0..<reserved.count {
            if losted[i] == reserved[j] - 1 || losted[i] == reserved[j] + 1 {
                has = j
                break
            }
        }

        if let index = has {
            reserved.remove(at: index)
            ans += 1
        }
    }

    return ans
}

filter를 사용해서 내가 for문으로 한 것을 빠르게 할 수 있다는 것을 항상 생각해보자..

참고

Programmers

Leave a comment