https://www.acmicpc.net/problem/10811
풀이
더보기
코틀린은 확장함수로 특정 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 |