[AtCoder] AtCoder Beginner Contest 301 D. Bitmask

TaeGN·2024년 11월 4일

AtCoder

목록 보기
38/55

문제풀이

  1. 2진수로 나타낸 s, n의 길이를 동일하게 맞춘다.
  2. 앞에서 부터 '?'를 '1'로 만들 수 있는지 확인하여 가능하면 '1', 불가능하면 '0'으로 치환한다.

주의사항


소요시간

20분


package AtCoder.ProblemList.Difficulty800_1199.Bitmask

fun main() {
    val S = readln().trim()
    val N = readln().trim().toLong()
    fun result(): Long {
        var s = S
        val n = N.toString(2)
        if (s.length > n.length) {
            for (i in 0 until (s.length - n.length)) {
                if (s[i] == '1') return -1
            }
            s = S.substring(s.length - n.length)
        }
        s = "0".repeat(n.length - s.length) + s
        val arr = IntArray(n.length)
        for (i in s.indices) {
            if (s[i] == '1') arr[i] = 1
        }
        for (i in s.indices) {
            if (s[i] == '?') {
                arr[i] = 1
                if (arr.joinToString("").toLong(2) > N) arr[i] = 0
            } else arr[i] = s[i].digitToInt()
        }
        return arr.joinToString("").toLong(2).let { if (it > N) -1 else it }
    }
    println(result())
}

문제링크

https://atcoder.jp/contests/abc301/tasks/abc301_d

0개의 댓글