문제 링크
문제 해설
문제 자체는 평범한 Up&Down 방식의 문제다. 최초 시작값과 끝값을 각각 \(-10^{18}\)과 \(10^{18}\)으로 설정한다. 이후 질의응답에 따라 시작값과 끝값을 변경하는데, 질의 응답에서 주어지는 \(x\)가 기존 시작값보다 작거나 기존 끝값보다 클 수도 있다. 따라서 질의 응답이 \(x\) ^인 경우에는 시작값을 기존 시작값과 \(x+1\) 중 더 큰 값으로 변경하고, \(x\) v인 경우에는 끝값을 기존 끝값과 \(x-1\) 중 더 작은 값으로 변경한다.
준성이의 최애 수를 특정할 수 있다는 것은 시작값과 끝값이 일치하는 경우이다. 따라서 매 질의응답마다 시작값과 끝값이 일치하는지 검사하여 처음으로 시작값과 끝값이 일치하는 인덱스를 저장해놓는다.
다만 힌트 1.의 경우를 주의해야 한다. 준성이의 최애 수를 알아내기 위해선 모든 질의응답이 참이어야 하는데, 이말은 곧 이전에 준성이의 최애 수를 알아냈다고 하더라도 그 이후의 질의응답에서 모순이 발생한다면 Paradox!를 출력하고 최초로 모순이 발생한 질의응답 번호를 출력해야 한다.(이 경우를 캐치하지 못해 계속 맞왜틀을 시전하고 있었다...) 모순이 발생하는 경우는 시작값이 끝값보다 큰 경우가 된다.
Code
import java.util.StringTokenizer
fun main() = with(System.`in`.bufferedReader()) {
var start = -1_000_000_000_000_000_000L
var end = 1_000_000_000_000_000_000L
val q = readLine().toInt()
var index = 0
for (i in 1..q) {
val st = StringTokenizer(readLine())
val x = st.nextToken().toLong()
when (st.nextToken()) {
"^" -> start = maxOf(start, x + 1)
"v" -> end = minOf(end, x - 1)
}
if (start == end && index == 0) {
index = i
} else if (start > end) {
println("Paradox!\n$i")
return@with
}
}
println(if (index == 0) "Hmm..." else "I got it!\n$index")
}
'Algorithm > BOJ' 카테고리의 다른 글
[Kotlin] 백준 25306 : 연속 XOR (0) | 2023.01.29 |
---|---|
[Kotlin] 백준 23300 : 웹 브라우저 2 (0) | 2023.01.26 |
[Kotlin] 백준 11444 : 피보나치 수 6 (2) | 2023.01.24 |
[Kotlin] 백준 23309 : 철도 공사 (0) | 2023.01.19 |
[Kotlin] 백준 1283 : 단축키 지정 (1) | 2023.01.18 |
댓글