10811번 바구니 뒤집기
이전에 포스팅한 10810 번과 유사하지만 이번엔 입력을 받은 start 와 end 사이의 배열을 뒤집는 문제이다.
다행히 코틀린에는 reverse 라는 Array 의 확장함수가 있어 쉽게 해결할 수 있다.
문제 분석
바구니의 갯수는 N개, 각 바구니에는 1 부터 N 까지 번호가 매겨져 있다고 했다. 이 번호는 가장 왼쪽이 1, 가장 오른쪽이 N 이다.
그렇다면, 바구니를 표현할 배열을 생성하고, 초기값을 1..2..3..N 이런식으로 지정해 줄 수 있다.
M 번 바구니의 순서를 뒤집을 것이므로 M 번 반복할 것이고, 입력으로 뒤집을 범위 i, j를 받는다.
조건을 보면, N, M 은 정수로 표현이 가능하고, i 는 j 보다 작거나 같으므로 별도의 예외처리를 해주지 않아도 괜찮다.
정리하면
1. 바구니를 표현할 배열을 지정하고 바구니의 번호로 초기값을 지정한다.
2. 첫번째 줄에 입력받은 M 번 만큼 반복을 진행한다.
3. 입력받은 i 와 j 를 reverse 함수에 넣어 해당 범위의 배열의 순서를 뒤집는다.
4. 반복이 끝난 뒤 바구니를 표현한 배열을 출력해준다.
주의할 점으론, 입력받은 i 와 j 는 바구니의 번호이지, 바구니를 표현할 배열의 index 가 아니기에 reverse 함수의 범위를 지정할때 신경써주어야 한다.
정답 코드
import java.io.BufferedReader
import java.io.InputStreamReader
fun main() {
BufferedReader(InputStreamReader(System.`in`)).use { br ->
val (basketCount, reverseCount) = br.readLine().split(" ").map { it.toInt() }
val baskets = IntArray(basketCount) { it + 1 }
repeat(reverseCount) {
val (start, end) = br.readLine().split(" ").map { it.toInt() }
baskets.reverse(start - 1, end)
}
println(baskets.joinToString(" "))
}
}
Detail
- IntArray
- 이전 문제까지는 배열을 사용할때 Array 를 사용했다. 하지만 배열의 요소가 특정 타입으로 정해진 경우,
Primitive Type Array 를 쓰는것이 메모리를 덜 사용할 수 있는 방법이다.
- 이전 문제까지는 배열을 사용할때 Array 를 사용했다. 하지만 배열의 요소가 특정 타입으로 정해진 경우,
- reverse
- reverse 확장함수는 Array 를 비롯하여 Primitive Type Array 에서 사용이 가능한 함수이다.
- Array.reverse() 는 전체 배열의 요소를 역순으로 변경한다.
- Array.reverse(fromIndex: Int, toIndex: Int) 형태는 fromIndex 부터 toIndex 전까지의 배열을 역순으로 변경한다. kotlin 1.4 버전부터 지원되는 확장함수 이다.
✏️ reverse 예시
val a = arrayOf(1, 2, 3, 4, 5)
a.reverse(startIndex = 1, toIndex = 4)
// a[1] 부터 a[3] 까지의 범위를 역순으로 정렬한다.
println(a.joinToString(" "))
// 결과 : 1 4 3 2 5
✏️ reverse 함수의 fromIndex 와 toIndex 가 같을 경우에
reverse 확장함수가 구현된 모습을 보면, fromIndex 와 toIndex 가 같을 경우 for loop 을 처리하지 않고 return 되고 있다.
불필요하게 loop 를 돌지 않으므로, 별도의 처리를 해주지 않아도 처리 시간에는 영향을 미치지 않는다.
✏️ reverse 참고
https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.collections/reverse.html
reverse
reverse CommonJSJVMNativeWasm-JSWasm-WASI Reverses elements in the array in-place. Since Kotlin1.0 Reverses elements of the array in the specified range in-place. Since Kotlin1.4 Parameters the start of the range (inclusive) to reverse. the end of the rang
kotlinlang.org
'코딩테스트' 카테고리의 다른 글
[백준] 10813 공 바꾸기 - Kotlin(코틀린) (2) | 2025.04.15 |
---|---|
[백준] 10810번 공 넣기 - Kotlin(코틀린) (1) | 2025.04.11 |
[백준] 25314번 코딩은 체육과목 입니다 - Kotlin(코틀린) (0) | 2025.04.11 |
[백준] 11382번 꼬마 정민 - Kotlin(코틀린) (0) | 2025.04.11 |
Java(자바) - 선택정렬, 버블정렬, 삽입정렬, LRU(Least Recently Used) (0) | 2023.01.07 |