Old_SWIFT(221012)/알고리즘이야기

백준 시간초과 해결방법

KataRN 2022. 2. 28. 17:32
반응형

안녕하세요. KataRN입니다.

 

오늘은 백준 시간초과 해결방법에 대해 알려드리려고합니다.

 

 

우선 이 방법은 알고리즘을 사용했음에도 시간초과가 되는 현상의 경우에 사용하시기 바랍니다.

알고리즘을 맞게 썼음에도 시간초과가 되는 경우가 있습니다. 

 

그전에 잠깐!

백준에서 코딩테스트를 하기 위해서는 Command Line Tool을 사용해야합니다.

아래 글을 참고해주세요~(CommandLineTool : https://katarnios.tistory.com/37)

 

import Foundation

final class FileIO {
    private let buffer: Data
    private var index: Int = 0
    
    init(fileHandle: FileHandle = FileHandle.standardInput) {
        self.buffer = try! fileHandle.readToEnd()! // 인덱스 범위 넘어가는 것 방지
    }
    
    @inline(__always) private func read() -> UInt8 {
        defer {
            index += 1
        }
        guard index < buffer.count else { return 0 }
        
        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)
    }


    @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 test1 = file.readInt() // 숫자
let test2 = file.readString() // 문자
var array = [Int]()
let n = file.readInt()
for _ in 0..<n {
	array.append(file.readInt())
}

// 입력값
// 1
// "S"
// 5
// 1 2 3 4 5

// 출력값
// 1
// "S"
// [1, 2, 3, 4, 5]

 

Command Line Tool을 실행 시키고 데이터를 입력합니다.

 

그리고 Control + D를 누릅니다.

그러면 출력값이 나옵니다.

 

감사합니다.

반응형