본문 바로가기
스터디(beakjoon)

Kotlin] 백준 10811번 문제 풀이

by 김마리님 2023. 4. 26.

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

 

10811번: 바구니 뒤집기

도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 순서대로 적혀져 있다. 바구니는 일렬로 놓여져 있고, 가장 왼쪽 바구니를 1번째 바구니, 그 다음 바구니를 2

www.acmicpc.net

 

 

풀이

더보기

코틀린은 확장함수로 특정 range 내부의 배열을 뒤집을 수 있다.

바로 reverse(fromIndex, toIndex)이다.

 

근데 이걸.. 그렇다고 예시처럼 fromIndex = 1, toIndex = 2 으로 뒤집으면 큰일나고..

왜냐면 Reverse를 까보면 알 수 있다.

@SinceKotlin("1.4")
public fun IntArray.reverse(fromIndex: Int, toIndex: Int): Unit {
    AbstractList.checkRangeIndexes(fromIndex, toIndex, size)
    val midPoint = (fromIndex + toIndex) / 2
    if (fromIndex == midPoint) return
    var reverseIndex = toIndex - 1
    for (index in fromIndex until midPoint) {
        val tmp = this[index]
        this[index] = this[reverseIndex]
        this[reverseIndex] = tmp
        reverseIndex--
    }
}

 현재 받은 fromIndex와 toIndex의 평균값을 내어 뒤집기 때문이다. 평균값을 내어 뒤집으면 굳이 배열 전체를 돌아 뒤집을 이유가 없고, 중간값까지만 뒤집으면 전체가 뒤집어지기 때문이다.

따라서, toIndex에는 뒤집고 싶은 시작지점(fromIndex)에서 뒤집고 싶은 갯수를 더하면 계산할 수 있다.

이를 이용해서 전에 코드를 구현하면

 

import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter

fun main(args: Array<String>) {
    question10811()
}

fun question10811() {
    var reader = BufferedReader(InputStreamReader(System.`in`))
    var writer = BufferedWriter(OutputStreamWriter(System.out))

    var type = reader.readLine().split(" ").map { it.toInt() }
    var busket = IntArray(type[0]) { it + 1 }

    for (i in 1 .. type[1]) {
        var range = reader.readLine().split(" ").map { it.toInt() - 1 }
        busket.reverse(range[0], range[0] + (range[1] - range[0] + 1))
    }

    writer.write(busket.joinToString(" "))
    writer.flush()

}

 

반응형