Where who wants to meet someone

백준 Swift [10989] 수 정렬하기 3 본문

백준 알고리즘 문제 기록/정렬

백준 Swift [10989] 수 정렬하기 3

Lust3r 2023. 8. 1. 19:32
728x90

난이도

브론즈 I

 

문제

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

 

10989번: 수 정렬하기 3

첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.

www.acmicpc.net

 

내 답안

import Foundation

final class FileIO {
    private let buffer:[UInt8]
    private var index: Int = 0

    init(fileHandle: FileHandle = FileHandle.standardInput) {

        buffer = Array(try! fileHandle.readToEnd()!)+[UInt8(0)] // 인덱스 범위 넘어가는 것 방지
    }

    @inline(__always) private func read() -> UInt8 {
        defer { index += 1 }

        return buffer[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)
    }
}

let fileIO = FileIO()

let n = fileIO.readInt()

var array = [Int]()

for _ in 1...n {
    array.append(fileIO.readInt())
}

array.sort()
var result = ""

for i in array.indices {
    result += "\(array[i])\n"
}

print(result)

- 기존에 정렬할 때 쓰던 방법으로는 시간 초과가 났기 때문에 다음의 자료를 참고하였다.

https://gist.github.com/JCSooHwanCho/30be4b669321e7a135b84a1e9b075f88

 

ps할 때 입력을 한꺼번에 받기 위한 유틸리티 클래스. fread의 swift 버전.

ps할 때 입력을 한꺼번에 받기 위한 유틸리티 클래스. fread의 swift 버전. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

 

- 위의 방법을 공유해주신 JCSooHwanCho 님 덕분에, FileIO의 readInt() 메서드를 사용해서 풀 수 있었다.

- 방법은 sort()만 사용할 때와 크게 다르지 않은데, 똑같이 입력을 받고, array에 append해준 뒤 sort()하여 result에 모아서 출력하는 방식을 사용했다.

 

- 혹시나 하나하나 print하는게 아니라 result로 모아서 출력한 것도 유의미한가? 해서 바꿨지만 어림도 없지..시간 초과