[Scala] BOJ 10866 - 덱(디큐)

YumeIroVillain·2023년 7월 30일
0

Chisel 독학

목록 보기
11/44
post-custom-banner

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

ArrayDeque를 사용했다.
ArrayDeque는 Scala 2.13부터 추가된 자료구조로
출처,
head, tail 상수시간 접근을 보장하는 서큘러 버퍼로 되어있어서
Tree로 구현되어있는 Vector보다 신속하다.

Scala ArrayDeque 깃허브

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")
			}
	}
}
profile
HW SW 둘다 공부하는 혼종의 넋두리 블로그 / SKKU SSE 17 / SWM 11th
post-custom-banner

0개의 댓글