본문 바로가기

PS/백준

[BOJ] 백준 18258 큐 2 (Swift)

반응형

문제

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

 

18258번: 큐 2

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 2,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

풀이

이 문제는 Queue 자료구조를 사용하면 쉽게 풀리는 것이 맞는데..
Swift에서는 입력과 출력이 느려서 다른분들의 도움을 받아서 풀었던 문제입니다.

Queue 자료구조에 대해 모르신다면 이 글을 읽어보시면 도움이 되실 것입니다.
https://dev-mandos.tistory.com/190

 

[자료구조] Queue에 대해 알아보고 구현해보기 (Swift)

Queue란? Queue 자료구조는 선입선출(First In First Out)FIFO의 특성을 갖는 자료구조 입니다. 즉, 먼저 들어온 것이 가장 먼저 나가는 구조입니다. 맛집에 먼저 줄을 섰던 사람이 먼저 들어가는 것과 동

dev-mandos.tistory.com

라이노, wapas님이 만들어주신 fread 방식으로 빠른 입력을 받는 코드를 작성하였고,
입력을 bytes 단위로 받아와서 풀이할 수 있었습니다..
입력 관련해서는 다른 분들의 코드를 많이 참고하였습니다.

print 함수가 느리기 때문에, String 변수에 담아주고 한번에 출력해주는 방식으로 구현하였습니다.

소스코드

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() -> Int {
var str = 0
var now = read()
while now == 10
|| now == 32 { now = read() } // 공백과 줄바꿈 무시
while now != 10
&& now != 32 && now != 0 {
str += Int(now)
now = read()
}
return str
}
}
struct Queue {
private var array: [Int] = []
private var index: Int = 0
var size: Int {
return array.count - index
}
var front: Int {
return self.isEmpty ? -1 : array[index]
}
var back: Int {
return self.isEmpty ? -1 : array.last!
}
var empty: Int {
return self.isEmpty ? 1 : 0
}
var isEmpty: Bool {
return array.count - index <= 0
}
mutating func push(_ element: Int) {
array.append(element)
}
mutating func pop() -> Int {
guard !self.isEmpty else {
return -1
}
let element = array[index]
index += 1
return element
}
}
let file = FileIO()
let n = file.readInt()
var queue: Queue = Queue()
var answer = ""
for _ in 0..<n {
let command = file.readString()
switch command {
case 448:
// push
queue.push(file.readInt())
case 335:
// pop
answer += "\(queue.pop())\n"
case 443:
// size
answer += "\(queue.size)\n"
case 559:
// empty
answer += "\(queue.empty)\n"
case 553:
// front
answer += "\(queue.front)\n"
case 401:
// back
answer += "\(queue.back)\n"
default:
continue
}
}
print(answer)
view raw 큐 2.swift hosted with ❤ by GitHub

후기

쉽게 풀 수 있을 줄 알았는데, 뭐가 많이 복잡했다..
Swift 입출력이 많이 느린것 같은데.. 어케 해결이 안될려나..

반응형