"""((10[0]+[1]+)|(01))+"""를 이용해서 풀이를 처음하였는데 100110011001의 경우에는 10011을 하나로 매칭시켜서 문제를 풀지 못하였다.
따라서 100을 기준으로 split하였고 각 내부에 위의 정규표현식이 통과되는지 확인하였다.
첫 원소는 비어있거나 100으로시작하지 않는 원소들이 들어가므로 그 경우를 커버하여 문제를 풀이하였다.
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
class IO2671 {
private val br = BufferedReader(InputStreamReader(System.`in`))
private val bw = BufferedWriter(OutputStreamWriter(System.out))
fun close() = bw.close()
fun flush() = bw.flush()
fun write(message: String) = bw.write(message)
fun getString(): String = br.readLine()
}
fun main() {
val io = IO2671()
val binary = io.getString()
var flag = true
binary.split("100").forEachIndexed { idx, split ->
if (idx == 0) {
if (split != "") {
"""(01)*""".toRegex().findAll(split).also { result ->
if (!checkEquality(result, split)) {
flag = false
}
if (!flag) return@forEachIndexed
}
}
} else {
val target = "100$split"
"""((10[0]+[1]+)|(01))*""".toRegex().findAll(target).also { result ->
if (!checkEquality(result, target)) {
flag = false
}
if (!flag) return@forEachIndexed
}
}
}
io.write(if (flag) "SUBMARINE" else "NOISE")
io.flush()
io.close()
}
fun checkEquality(result: Sequence<MatchResult>, target: String): Boolean {
var str = ""
result.iterator().forEach {
str += it.value
}
return str == target
}