[백준] 2671번 잠수함식별

Greenddoovie·2021년 12월 16일
0

백준

목록 보기
11/30

2671번 잠수함식별

접근 방법

"""((10[0]+[1]+)|(01))+"""를 이용해서 풀이를 처음하였는데 100110011001의 경우에는 10011을 하나로 매칭시켜서 문제를 풀지 못하였다.

따라서 100을 기준으로 split하였고 각 내부에 위의 정규표현식이 통과되는지 확인하였다.

첫 원소는 비어있거나 100으로시작하지 않는 원소들이 들어가므로 그 경우를 커버하여 문제를 풀이하였다.

Code

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
}
profile
기초를 이해하면 세상이 다르게 보인다

0개의 댓글