https://www.acmicpc.net/problem/10866
ArrayDeque를 사용했다.
ArrayDeque는 Scala 2.13부터 추가된 자료구조로
출처,
head, tail 상수시간 접근을 보장하는 서큘러 버퍼로 되어있어서
Tree로 구현되어있는 Vector보다 신속하다.
import scala.io.StdIn
import scala.collection.mutable.ArrayDeque
object Constant{
val VERBOSE = false
}
object Main {
def main(args: Array[String]): Unit = {
val vec = ArrayDeque[Int]()
val N = StdIn.readInt()
for (_ <- 0 until N) {
val command = StdIn.readLine().split(" ")
val op = command(0)
if(Constant.VERBOSE) println(command.mkString(" "))
op match {
case "push_front" => vec.prepend(command(1).toInt)
case "push_back" => vec.append(command(1).toInt)
case "pop_front" => println(if(vec.isEmpty) -1 else vec.removeHead())
case "pop_back" => println(if(vec.isEmpty) -1 else vec.removeLast())
case "size" => println(vec.size)
case "empty" => println(if (vec.isEmpty) 1 else 0)
case "front" => println(vec.headOption.getOrElse(-1))
case "back" => println(vec.lastOption.getOrElse(-1))
}
if(Constant.VERBOSE){
println(vec)
println("\n")
}
}
}
}
TLE가 뜨지만, 어쨌든 답은 통과한다.
TLE는 스칼라 자체의 느린 속도에 원인이 있다고 간주하였다.
내가 짠 코드는 아래와 같다.
(기능적 측면은 동일하지만..)
import scala.io.StdIn
import scala.collection.mutable.ArrayDeque
// internally, Vector is Tree so it is O(logn)
// internally, ArrayDeque is resizable circular buffer so it is O(1)
object Constant{
val VERBOSE = false
}
object Main{
def main(args:Array[String]):Unit = {
val T:Int = StdIn.readInt()
val vec = ArrayDeque[Int]()
for(t <- 1 to T) {
val cmd = StdIn.readLine().split(" ");
if(Constant.VERBOSE) println(cmd.mkString(" "))
if(cmd(0) == "push_front"){
vec.prepend(cmd(1).toInt)
}
else if(cmd(0) == "push_back"){
vec.append(cmd(1).toInt)
}
else if(cmd(0) == "pop_front"){
if(vec.isEmpty) println(-1) else println(vec.removeHead())
}
else if(cmd(0) == "pop_back"){
if(vec.isEmpty) println(-1) else println(vec.removeLast())
}
else if(cmd(0) == "size"){
println(vec.size)
}
else if(cmd(0) == "empty"){
println(if(vec.isEmpty) 1 else 0)
}
else if(cmd(0) == "front"){
if(vec.isEmpty) println(-1) else println(vec.head)
}
else if(cmd(0) == "back"){
if(vec.isEmpty) println(-1) else println(vec.last)
}
else{
println("ERROR")
}
}
if(Constant.VERBOSE){
println(vec)
println("\n")
}
}
}