본문 바로가기
TIL

[240331] % 사용 유의하기/swapAt

by 줍 2024. 3. 31.

1. m을 처리할때 12보다 큰 12의 배수인 경우, m에 0이 아니라 12가 할당되도록 해주어야하는데 거기까지 고려를 못했다. 케이스를 꼼꼼히 따져봐야겠다.

func solution(_ today:String, _ terms:[String], _ privacies:[String]) -> [Int] {
    let today = today.split(separator: ".").map { Int($0)! }
    let (ty, tm, td) = (today[0], today[1], today[2])
    var answer: [Int] = []

    var dict: [String: Int] = [:]
    for term in terms {
        let term = term.split(separator: " ").map { String($0) }
        dict[term[0]] = Int(term[1])
    }

    for (i, privacy) in privacies.enumerated() {
        let privacy = privacy.split(separator: " ").map { String($0) }
        let (date, kind) = (privacy[0], privacy[1])
        let ymd = date.split(separator: ".").map { Int($0)! }
        var (y, m, d) = (ymd[0], ymd[1], ymd[2])

        d += 27
        m +=  dict[kind]! - 1
        if d > 28 { m += 1; d %= 28 }
        if m > 12 { y += m % 12 == 0 ? m / 12 - 1 : m / 12 ; m = m % 12 == 0 ? 12 : m % 12 }

        if ty > y || (ty == y && tm > m) || (ty == y && tm == m && td > d) { answer.append(i + 1) }
    }
    return answer
}

 

 

2. 체육복 문제

여벌이 있는 학생이 도난당한 경우 lost, reserve 에서 모두 제외해야하고,

배열이 오름차순으로 주어진다는 조건이 없음을 고려해야했던 문제

func solution(_ n:Int, _ lost:[Int], _ reserve:[Int]) -> Int {
    var lostArr = Set(lost).subtracting(reserve).sorted()
    var reserveArr = Set(reserve).subtracting(lost).sorted()
        
    for r in reserveArr {
        if lostArr.contains(r - 1) {
            let index = lostArr.firstIndex(of: r - 1)!
            lostArr.remove(at: index)
            continue
        }
        if lostArr.contains(r + 1) {
            let index = lostArr.firstIndex(of: r + 1)!
            lostArr.remove(at: index)
        }
    }
    return n - lostArr.count
}

 

 

3. swapAt을 쓰면 되는데, 인덱스를 어떻게 구하냐의 문제이다.

firstIndex(of:)를 사용하는 경우 players의 크기가 너무 커졌을때 시간초과가 난다.

그래서 해쉬값처럼 쓸수있도록 딕셔너리로 만들어 시간복잡도를 줄이는 방법으로 접근해야한다.

func solution(_ players:[String], _ callings:[String]) -> [String] {
    var result = players
    var dict: [String: Int] = [:]
  
    for (i, player) in players.enumerated() {
        dict[player] = i
    }
    for call in callings {
        let i = dict[call]!
        result.swapAt(i - 1, i)
        dict[result[i - 1]]! -= 1
        dict[result[i]]! += 1
    }
    return result
}