세상을 더 좋게

[Baekjoon] 11723 Set (Kotlin) 집합 (코틀린) 본문

카테고리 없음

[Baekjoon] 11723 Set (Kotlin) 집합 (코틀린)

나는SOU 2025. 3. 2. 21:23

https://www.acmicpc.net/problem/11723

비트마스킹을 활용한 문제.

두 가지만 알고 가면 비트마스킹의 사용을 이해하고 위 문제를 풀 수 있다.
1. 비트마스킹은 비트를 스위치로 생각하며 Int 기준 최대 32개의 스위치를 가진 상태로 활용하는 사고의 전환 방식

2. 메소드 활용

bitmask = bitmask or (1 shl i)i번 비트 켜기

bitmask = bitmask and (1 shl i).inv()i번 비트 끄기

bitmask = bitmask xor (1 shl i)i번 비트 반전

if (bitmask and (1 shl i) != 0)i번 비트가 켜져 있는지 확인

import java.io.BufferedReader
import java.io.InputStreamReader

fun main() {
    val br = BufferedReader(InputStreamReader(System.`in`))
    val n = br.readLine().toInt()
    val sb = StringBuilder()
    var bitmask = 0
    
    repeat(n) {
        val input = br.readLine().split(" ")
        val type = input[0]
        var num = 0
        if (type != "all" && type != "empty") {
            num = input[1].toInt()
        }
        
        when(type) {
            "add" -> {
                bitmask = bitmask or (1 shl num)
            }
            "remove" -> {
                bitmask = bitmask and (1 shl num).inv()
            }
            "check" -> {
                val isBit : Int = bitmask and (1 shl num)
                sb.append(if (isBit != 0) "1" else "0").append("\n")
            }
            "toggle" -> {
                bitmask = bitmask xor (1 shl num)
            }
            "all" -> {
                bitmask = (1 shl 21) - 1
            }
            "empty" -> {
                bitmask = 0
            }
        }
    }
    
    println(sb)
}
  • "all"은 1 - 20까지 모두 포함이므로, 결국 1 - 20까지 스위치를 켜는 것이고 이는 21까지 이동한 이진수에서 1를 빼면 쫙 1111.. 되는 형식
  • 시간 초과 때문에 readln()보다는 bufferReader()를 사용