백준 14395 번
https://www.acmicpc.net/problem/14395
BFS 문제이다.
생각보다 그리 어려운 문제는 아닌 것 같은데, 어느 깊이에서 끊어야 되는지를 못찾아서 한참 헤맸다
val set = HashSet<Long>()
que.offer(Number(S, 0, ""))
먼저 BFS로 풀기때문에 que
에 값을 넣고, HashSet이 필요한데 필요한 이유는 중복되는 값을 넣지 않기 위해서 사용된다.
굳이 HashSet을 사용하지 않고 isVisited같은 boolean 배열을 사용하거나 ArrayList를 사용해서 중복된 값이 있는지를 체크하는 것도 하나의 방법이 될 수 있을 것 같다.
for (i in 0 until 4) {
var nowNum = poll.num
var nowDepth = poll.depth
var nowOper = poll.oper
if (i == 0) {
nowNum *= nowNum
nowOper += "*"
} else if (i == 1) {
nowNum += nowNum
nowOper += "+"
} else if (i == 2) {
nowNum -= nowNum
nowOper += "-"
} else if (i == 3 && nowNum != 0L) {
nowNum /= nowNum
nowOper += "/"
}
if (nowNum == T) {
ans = nowOper
return nowDepth
} else if (!set.contains(nowNum)) {
set.add(nowNum)
que.offer(Number(nowNum, nowDepth + 1, nowOper))
}
}
문제에서 4가지의 아스키 연산 순서가 * , + , - , /
순서라고 나와있으므로
해당 순서에 맞게 반복을 하도록 해서 연산을 해주면 된다.
중복된 값이 아닐 경우에는 que
에 계속 넣어서 너비 탐색을 하면 되고 처음으로 만나게되는 T의 값이 정답이 되게된다.
import java.util.*
import java.io.*
private var S = 0L
private var T = 0L
private var result = Int.MAX_VALUE
private var ans = ""
private data class Number(var num: Long = 0, var depth: Int = 0, var oper: String = "")
fun main() {
val br = BufferedReader(InputStreamReader(System.`in`))
val st = StringTokenizer(br.readLine())
S = st.nextToken().toLong()
T = st.nextToken().toLong()
if (S == T) {
println(0)
return
}
if(BFS() == -1) {
println(-1)
} else {
println(ans)
}
} // End of main
private fun BFS(): Int {
val que: Queue<Number> = LinkedList()
val set = HashSet<Long>()
que.offer(Number(S, 0, ""))
while (!que.isEmpty()) {
val poll = que.poll()
for (i in 0 until 4) {
var nowNum = poll.num
var nowDepth = poll.depth
var nowOper = poll.oper
if (i == 0) {
nowNum *= nowNum
nowOper += "*"
} else if (i == 1) {
nowNum += nowNum
nowOper += "+"
} else if (i == 2) {
nowNum -= nowNum
nowOper += "-"
} else if (i == 3 && nowNum != 0L) {
nowNum /= nowNum
nowOper += "/"
}
if (nowNum == T) {
ans = nowOper
return nowDepth
} else if (!set.contains(nowNum)) {
set.add(nowNum)
que.offer(Number(nowNum, nowDepth + 1, nowOper))
}
}
}
return -1
} // End of BFS