본문 바로가기
Problem Solving/BOJ

백준 1615번 교차개수세기 - 스위프트(Swift) 시간초과 해결 못함

by 어멘드 2022. 1. 12.
반응형

 또 TLE가 났는데, 이번엔 해결을 못하겠어서 결국 C++로 제출했다ㅠㅠ 추측하고 있는 이유는 1. 튜플 정렬 때문 2. 지금까진 대부분 N=100,000이었는데 이번엔 200,000이라..? 채점 현황 가서 Swift로 맞은 사람이 있는지 봤는데 제출한 사람조차 없었다. 그래서 빠르게 포기하고 C++로ㅠㅠ 아래는 TLE 받은 Swift 코드

import Foundation

class FenwickTree {
    var tree = Array(repeating: 0, count: 2001)
    
    func sum(to: Int) -> Int {
        var ret = 0
        var pos = to
        
        while (pos > 0) {
            ret += tree[pos]
            pos &= (pos - 1)
        }
        
        return ret
    }
    
    func add(at: Int, val: Int) {
        var pos = at
        
        while(pos < tree.count) {
            tree[pos] += val
            pos += (pos & -pos)
        }
    }
}

let input = readLine()!.split(separator: " ").map{ Int(String($0))! }
let N = input[0]
let M = input[1]

var edges = Array(repeating: (0, 0), count: M)
for i in 0..<M {
    let edge = readLine()!.split(separator: " ").map{ Int(String($0))! }
    let start = edge[0]
    let end = edge[1]
    
    edges[i] = (start, end)
}
edges.sort(by: {
    // 자기 자신에서 나온 것이 카운트에 영향을 미치지 않게 하려면 튜플의 뒷 값까지 오름차순으로 정렬해야 함.
    if $0.0 < $1.0 { return true }
    else if $0.0 == $1.0 { return $0.1 < $1.1 }
    else { return false }
})

var result: Int64 = 0
var fwt = FenwickTree()
for edge in edges {
    let end = edge.1
    
    // 윗 줄에서는 start보다 왼쪽에 있고, 아랫줄에서는 end보다 오른쪽에 있는 애들과 교차한다.
    if end != N { result += Int64(fwt.sum(to: N - end)) }
    fwt.add(at: N + 1 - end, val: 1)
}
print(result)
반응형

댓글