[Scala] BOJ 10866 - N과 M 1

YumeIroVillain·2023년 7월 30일
0

Chisel 독학

목록 보기
12/44
post-thumbnail
post-custom-banner

재귀 공부하는데는 N과 M만한게 없다.
https://www.acmicpc.net/problem/15649

import scala.io.StdIn
import scala.util.control.Breaks._
import scala.collection.mutable.ArrayDeque

object Constant{
	val VERBOSE = false
}

object Global{
	var N:Int = 0
	var R:Int = 0
	var visited:Array[Boolean] = new Array[Boolean](Global.N + 1)
}

object Main{
	def main(args:Array[String]):Unit = {
		val cmd = StdIn.readLine().split(" ")
		Global.N = cmd(0).toInt
		Global.R = cmd(1).toInt

		var dq = ArrayDeque[Int]()
		Global.visited = new Array[Boolean](Global.N + 1)
		solve(dq, 0)
	}
	def solve(dq:ArrayDeque[Int], depth:Int):Unit = {
		if(depth == Global.R){
			println(dq.mkString(" "))
		}
		for(tmp <- 1 to Global.N) {
			breakable{
				if(Global.visited(tmp))
					break()
				dq.append(tmp)
				Global.visited(tmp) = true
				solve(dq, depth+1)
				dq.removeLast()
				Global.visited(tmp) = false
			}
		}
	}
}


What I Learned

  • Scala에서는 continue문 없이 break() 메서드만 존재한다. 이를 위해 breakable 블록을 미리 잡아놓아야 하며, 이를 위해 또 import scala.util.control.Breaks._를 해야한다.(귀찮기도 하다...)
  • ArrayDeque의 원소를 공백으로 띄워 한 줄에 출력하기 위해서는, println(dq.mkString(" ")) 를 쓰면 된다.
  • Global 변수는 따로 지원하지 않는 모양이고, 정 쓰고싶다면 Object를 따로 선언하여 그것을 Global 변수를 위한 컨테이너(?)처럼 써야 한다.
  • 공백배열을 미리 초기화하고 싶다면, Variable 선언시 RHS에 아무것도 안넣을수는 없고
    var visited:Array[Boolean] = new Array[Boolean](Global.N + 1)
    해놓았다가, 나중에 한 번 더 접근하여 제대로 된 Global.N으로 초기화해주어야 한다.(컴파일시점에는 Global.N이 몇 인지 모르므로)
  • 위에 언급한대로, Array의 변수를 처음부터 할당하고자 한다면 ()에 정수를 넣으면 된다.

For to 구문과 For until 구문의 차이

출처

  • For to: for(i<-3 to 5) => 얘는 횟수가 중요. 5"회" 반복
  • For until: for(i<-1 until 18) => 18 되기 직전까지 반복. 즉 ;i<18;과 동일.

여담

N이랑 M 사이즈 8 이하의 정수밖에 안되는데...
메모리점유랑 속도차가 이게 말이 돼?
너무 안좋은데 Scala..?

profile
HW SW 둘다 공부하는 혼종의 넋두리 블로그 / SKKU SSE 17 / SWM 11th
post-custom-banner

0개의 댓글