문제

코드
fun main() {
val br = System.`in`.bufferedReader()
val sb = StringBuffer()
val n = br.readLine().toInt()
val s = IntArray(21)
repeat(n) {
val input = br.readLine()
val (cmd, x) = if (input == "all" || input == "empty") {
input to -1
} else {
input.split(" ").let { it[0] to it[1].toInt() }
}
when (cmd) {
"add" -> s[x] = 1
"remove" -> s[x] = 0
"check" -> sb.append("${s[x]}\n")
"toggle" -> s[x] = if (s[x] == 0) 1 else 0
"all" -> { s.fill(1) }
"empty" -> { s.fill(0) }
}
}
println(sb)
br.close()
}
풀이
처음에는 단순 리스트에 문제의 연산 작업을 직접 수행하려고 했었다. 근데 입력이 최대 3,000,000번 발생할 수 있기 때문에 비효율적이라고 생각했다.
그래서 문제를 읽다가 x의 범위가 1부터 20까지로 제한되어있는 것을 보고, 배열을 써도 되지 않을까 하는 생각이 들었다.
x를 s에 추가한다면 s[x] = 1로 설정,
x를 s에서 제거한다면 s[x] = 0으로 설정
그래서 처음 작성한 코드가 아래와 같다.
fun main() {
val br = System.`in`.bufferedReader()
val n = br.readLine().toInt()
val s = IntArray(21)
for (i in 0..<n) {
val op = br.readLine()
if (op == "all") {
for (j in 1..20) { s[j] = 1 }
} else if(op == "empty") {
for (j in 1..20) { s[j] = 0 }
} else {
val cmd = op.split(" ")[0]
val x = op.split(" ")[1].toInt()
when (cmd) {
"add" -> s[x] = 1
"remove" -> s[x] = 0
"check" -> println(s[x])
"toggle" -> s[x] = if (s[x] == 0) 1 else 0
}
}
}
}
이렇게 작성했더니, 시간 초과가 발생했다
설마 이것도 stringBuffer를 사용해야하는건가라는 생각이 들었다.
s[x]를 계속해서 출력하는데, 이게 3,000,000번 반복되면 문제가 될 것 같았다.
그래서 stringBuffer를 사용해서 출력하도록 변경했다.
가독성을 높이기 위에 for문 대신 repeat문을 사용하고, cmd와 x를 받아오는 로직을 수정했다.
그리고 배열의 모든 요소를 변경하는 fill 함수를 사용해서 all과 empty를 구현했다.
'Algorithm > 📖Baekjoon' 카테고리의 다른 글
#8979 올림픽 (0) | 2024.07.26 |
---|---|
#9655 돌 게임 (0) | 2024.07.25 |
#1157 단어 공부 (0) | 2024.07.23 |
#2292 벌집 (0) | 2024.07.22 |
#5073 삼각형과 세 변 (1) | 2024.07.22 |
댓글