[白俊5904-Kotlin]Mooゲーム


質問リンク
  • nの位置がS(i)に存在すると仮定する.
  • S(i)はS(i-1)+moo...S(i-1)、
  • を表す
  • nの位置はS(i)にあり、これはS(i−1)が存在しないことを意味する.
  • そのため、S(i)に存在することを知ったとき、私たちが考慮しなければならない区間はmooo...+S(i-1)区間.
  • 先moo...セクションに存在するコンテンツを検索するには、nが(S(i)の長さ-S(i-1)の長さ)以下である場合の条件を決定する必要があります.
  • nの位置がS(i−1)区間に存在する場合、S(i−1)区間を起点としてnの相対位置を変更し、最初から変更したnが存在する区間を再検索する.
  • import java.io.BufferedReader
    import java.io.BufferedWriter
    
    private lateinit var bufferedReader: BufferedReader
    private lateinit var bufferedWriter: BufferedWriter
    
    fun main() {
        bufferedReader = System.`in`.bufferedReader()
        bufferedWriter = System.out.bufferedWriter()
    
        // 1. get n
        val n = bufferedReader.readLine().toInt()
    
        // 2. print Nth letter
        findNthLetter(n, 1, 3)
    
        bufferedReader.close()
        bufferedWriter.close()
    }
    
    fun findNthLetter(n: Int, k: Int, baseLength: Int) {
        if (n == 1) {
            bufferedWriter.write("m")
            return
        }
    
        if (n == 2 || n == 3) {
            bufferedWriter.write("o")
            return
        }
    
        val mid = k + 3 //◀ o는 (k + 2)개 이고, m 까지 포함하면 (k + 3)을 해주어야 합니다.
        val total = baseLength * 2 + mid
        if (n > total) {
            findNthLetter(n, k + 1, total)
            return
        }
    
        // moomooomoo 일 때, n의 위치가 mooo에 위치하는지 확인하는 조건문 입니다.
        if (n <= (total - baseLength)) {
            if (n - baseLength == 1) bufferedWriter.write("m")
            else bufferedWriter.write("o")
        } else {
            // n의 위치가 뒤에 있는 moo에 위치할 때, n의 상대적 위치를 변경시키고 처음부터 재귀를 시작합니다.
            findNthLetter(n - (baseLength + mid), 1, 3)
        }
    }