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()
}

반응형
'스터디(beakjoon)' 카테고리의 다른 글
| Kotlin] 백준 27866번 문제 풀이 (0) | 2023.04.27 |
|---|---|
| Kotlin] 백준 1546번 문제 풀이 (0) | 2023.04.27 |
| Kotlin] 백준 3052번 문제 풀이 (0) | 2023.04.25 |
| Kotlin] 백준 5597번 문제 풀이 (0) | 2023.04.25 |
| Kotlin] 백준 10813번 문제 풀이 (0) | 2023.04.24 |