본문 바로가기
Problem Solving/BOJ

백준 7511번 소셜 네트워킹 어플리케이션 - 스위프트(Swift) 시간초과 해결

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

 오랜만에 원인모를 TLE가 났다. 심지어 이번에는 100%에서 시간 초과가 났다...! 채점 현황을 보니까 Swift로 맞은 분이 딱 한 분 있었다. 그럼 또 내 코드 문제란 건데..ㅠㅠ

 결론은 삼항 연산자를 if-else문으로 고쳐서 AC를 받았다. 여러 가지 실험을 해봤는데 삼항 연산자를 쓰는 것보다 if-else로 하는 것이 아주 조금 더 빨랐다. 이 미세한 차이로 TLE가 AC로 바뀌었다...... PS에서는 삼항 연산자도 맘대로 못쓰다니

 아래는 실험해본 코드

import Foundation

func check(_ n: Int) -> Bool {
    return n % 2 == 0
}



// 삼항연산자
let start = CFAbsoluteTimeGetCurrent()
var resultString = ""
for i in 0..<1_000_000 {
    resultString.write("\(check(i) == check(i+1) ? "t" : "f")")
}
let end = CFAbsoluteTimeGetCurrent()
print(end - start)      // 0.6643459796905518



// if-else
let start2 = CFAbsoluteTimeGetCurrent()
var resultString2 = ""
for i in 0..<1_000_000 {
    if check(i) == check(i+1) {
        resultString2.write("t")
    } else {
        resultString2.write("f")
    }
}
let end2 = CFAbsoluteTimeGetCurrent()
print(end2 - start2)    // 0.5896239280700684

 


import Foundation

var parent = [Int]()
var size = [Int]()

func initUnionFind(n: Int) {
    parent = (0..<n).map{ $0 }
    size = Array(repeating: 1, count: n)
}

func find(_ x: Int) -> Int {
    if parent[x] == x { return x }
    
    parent[x] = find(parent[x])
    
    return parent[x]
}

func union(a: Int, b: Int) {
    var pa = find(a), pb = find(b)
    
    guard pa != pb else { return }
    
    if size[pa] < size[pb] { swap(&pa, &pb) }
    parent[pb] = pa
    size[pa] += size[pb]
}

func isConnected(u: Int, v: Int) -> Int {
    return find(u) == find(v) ? 1 : 0
}

var resultString = ""

let T = Int(readLine()!)!

for t in 1...T {
    let n = Int(readLine()!)!
    let k = Int(readLine()!)!
    
    initUnionFind(n: n)
    
    for _ in 0..<k {
        let input = readLine()!.split(separator: " ").map{ Int(String($0))! }
        let a = input[0]
        let b = input[1]
        
        union(a: a, b: b)
    }
    
    let m = Int(readLine()!)!
    
    resultString.write("Scenario \(t):\n")
    
    for _ in 0..<m {
        let input = readLine()!.split(separator: " ").map{ Int(String($0))! }
        let u = input[0]
        let v = input[1]
        
        if find(u) == find(v) {				// 삼항연산자 대신 if-else 구문 사용
            resultString.write("1\n")
        } else {
            resultString.write("0\n")
        }
    }
    
    resultString.write("\n")
}

print(resultString)
반응형

댓글