λ°±μ€€ - μ‹ μž…μ‚¬μ›(Swift)

2022. 10. 24. 11:07ㆍAlgorithm

λ°±μ€€ - μ‹ μž…사원(Swift)

 

 

 λ¬Έμ œ μ„€λͺ…

 

https://www.acmicpc.net/problem/1946

 

1946번: μ‹ μž… 사원

첫째 μ€„μ—λŠ” ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 개수 T(1 ≤ T ≤ 20)κ°€ 주어진닀. 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 첫째 쀄에 μ§€μ›μžμ˜ 숫자 N(1 ≤ N ≤ 100,000)이 주어진닀. λ‘˜μ§Έ 쀄뢀터 N개 μ€„μ—λŠ” 각각의 μ§€μ›μžμ˜ μ„œλ₯˜μ‹¬μ‚¬ μ„±

www.acmicpc.net

 

 λ‚˜μ˜ 풀이

 

 

μ„œλ₯˜μ‹œν—˜μ΄λ‚˜ λ©΄μ ‘μ‹œν—˜ λ‘˜ 쀑 ν•˜λ‚˜μ˜ κΈ°μ€€μœΌλ‘œ λ¨Όμ € 정렬을 μ‹œν‚€λŠ”λ° μ΄λ ‡κ²Œ ν•˜λ©΄ λ’€μ—μžˆλŠ” 값은 항상 μ•žμ— μžˆλŠ” 값보닀 1개 이상 뒀쳐지기 λ•Œλ¬Έμ— μΉ΄μš΄νŠΈκ°€λ˜λ €λ©΄ μ•žμ— μžˆλŠ” κ°’μ˜ λ‚˜λ¨Έμ§€ κ°’(μ •λ ¬λ˜μ§€ μ•Šμ€ κ°’)보닀 λ†’μ•„μ•Όν•œλ‹€.

 

μ£Όμ˜ν•  점은 λ‚˜λ¨Έμ§€ 값은 μ§„ν–‰λ λ•Œλ§ˆλ‹€ μˆœμœ„κ°€ 높아지면 κ°€μž₯ 높은 μˆœμœ„λ₯Ό κ°±μ‹ μ‹œν‚€κ³  진행 ν•΄μ•Όν•œλ‹€λŠ” 것이닀.

 

그리고 이 문제λ₯Ό ν’€λ©΄μ„œ readLineμœΌλ‘œλŠ” ν’€ 수 μ—†λ‹€λŠ” 것도 μ•Œκ²Œλ˜μ—ˆλ‹€. readLine은 ν•œ 쀄씩 μ½κ²Œλ˜λŠ”λ° μ΄λŠ” μž…λ ₯값이 100,000κ°œκ°€ λ„˜μ–΄κ°€λ©΄ μ‹œκ°„μ΄ˆκ³Όκ°€ 일어났닀. 

 

κ·Έλž˜μ„œ λŒ€μ•ˆμœΌλ‘œ λΌμ΄λ…Έλ‹˜μ˜ FileIOλ₯Ό μ΄μš©ν•΄μ„œ 버퍼λ₯Ό μ΄μš©ν•΄μ„œ 문제λ₯Ό ν•΄κ²°ν•΄μ•Όν•œλ‹€. 

λ²„νΌλŠ” CPU와 μž…μΆœλ ₯μž₯μΉ˜κ°„μ˜ 차이λ₯Ό μ΅œμ†Œν™”μ‹œν‚€κΈ°μœ„ν•΄μ„œ μ‚¬μš©ν•˜λŠ” μž„μ‹œμ μΈ 곡간이며, CPUμ—μ„œ μž…μΆœλ ₯μž₯치의 μš”κ΅¬λ₯Ό μ¦‰κ°μ μœΌλ‘œ ν˜ΈμΆœν•˜λŠ” 것보닀 λ²„νΌμ—μ„œ 데이터λ₯Ό λͺ¨μ•˜λ‹€κ°€ ν•œλ²ˆμ— μ²˜λ¦¬ν•˜λŠ” 것이 효율적이기 λ•Œλ¬Έμ— 버퍼λ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμœΌλ‘œ μ•Œκ³ μžˆλ‹€. (μ •ν™•ν•˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€πŸ’§)

 

import Foundation

// λΌμ΄λ…Έλ‹˜μ˜ FileIO
final class FileIO {
    private var buffer:[UInt8]
    private var index: Int
    
    init(fileHandle: FileHandle = FileHandle.standardInput) {
        buffer = Array(fileHandle.readDataToEndOfFile())+[UInt8(0)] // 인덱슀 λ²”μœ„ λ„˜μ–΄κ°€λŠ” 것 방지
        index = 0
    }
    
    @inline(__always) private func read() -> UInt8 {
        defer { index += 1 }
        
        return buffer.withUnsafeBufferPointer { $0[index] }
    }
    
    @inline(__always) func readInt() -> Int {
        var sum = 0
        var now = read()
        var isPositive = true
        
        while now == 10
                || now == 32 { now = read() } // 곡백과 μ€„λ°”κΏˆ λ¬΄μ‹œ
        if now == 45{ isPositive.toggle(); now = read() } // 음수 처리
        while now >= 48, now <= 57 {
            sum = sum * 10 + Int(now-48)
            now = read()
        }
        
        return sum * (isPositive ? 1:-1)
    }
    
    @inline(__always) func readString() -> String {
        var str = ""
        var now = read()
        
        while now == 10
                || now == 32 { now = read() } // 곡백과 μ€„λ°”κΏˆ λ¬΄μ‹œ
        
        while now != 10
                && now != 32 && now != 0 {
            str += String(bytes: [now], encoding: .ascii)!
            now = read()
        }
        
        return str
    }
}
let file = FileIO()
let tc = file.readInt()

for _ in 0..<tc {
    var arr: [(Int, Int)] = []
    var cnt = 1
    let n = file.readInt()
    for _ in 0..<n {
        arr.append((file.readInt(), file.readInt()))
    }
    arr.sort(by: {$0.1 < $1.1})
    var min = arr[0].0
    for i in 1..<arr.count {
        if arr[i].0 < min {
            min = arr[i].0
            cnt += 1
        }
    }
    print(cnt)
}

 

 

'Algorithm' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

λ°±μ€€ - 뒀집기(Swift)  (0) 2022.10.24
λ°±μ€€ - μΉ΄λ“œ μ •λ ¬ν•˜κΈ°(Swift)  (0) 2022.10.24
λ°±μ€€ - 30(Swift)  (0) 2022.10.24
λ°±μ€€ - μ£Όμœ μ†Œ(Swift)  (0) 2022.10.24
λ°±μ€€ - μˆ˜λ“€μ˜ ν•©(Swift)  (0) 2022.10.23