본문 바로가기
  • 개발하는 곰돌이
Algorithm/BOJ

[Kotlin] 백준 26597 : 이 사람 왜 이렇게 1122를 좋아함?

by 개발하는 곰돌이 2023. 1. 25.

문제 링크

 

26597번: 이 사람 왜 이렇게 1122를 좋아함?

질의응답에 모순이 없고 준성이의 최애 숫자가 무엇인지 정확히 알 수 있으므로 첫째 줄에 I got it!을 출력한다. $3$번째 질의응답을 통해 준성이의 최애 숫자가 무엇인지 정확히 알 수 있으므로

www.acmicpc.net



문제 해설

문제 자체는 평범한 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")
}

댓글