정수 n : 반복될 횟수
slicer : 정수 3개가 담긴 리스트 -> [ a, b, c ]
num_list : 슬라이싱 해야 할 정수 리스트.
slicer에 담긴 정수를 차례대로 a, b, c라고 할 때, n에 따라 다음과 같이 num_list를 슬라이싱 하려고 합니다.
- n = 1 : num_list의 0번 인덱스부터 b번 인덱스까지
- n = 2 : num_list의 a번 인덱스부터 마지막 인덱스까지
- n = 3 : num_list의 a번 인덱스부터 b번 인덱스까지
- n = 4 : num_list의 a번 인덱스부터 b번 인덱스까지 c 간격으로
n으로 뭘 입력받는지에 따라서 리스트 슬라이싱의 범위가 정해진다. switch-case 문을 사용해야겠다는 생각이 드는데, kotlin에서는 when을 사용해서 간결하게 표현할 수 있다.
var a = slicer[0]
var b = slicer[1]
var c = slicer[2]
일단 slicer에 인덱스 범위가 될 정수가 순서대로 a, b, c니까 미리 초기화해준다.
return when(n){
1 -> num_list.sliceArray(0..b)
2 -> num_list.sliceArray(a until num_list.size)
3 -> num_list.sliceArray(a..b)
4 -> num_list.sliceArray((a..b step c).toList())
else -> intArrayOf()
}
sliceArray()는 명시된 범위의 배열을 리턴하는 함수이다.

문제에서는 매개변수의 타입과 반환 타입이 IntArray이기 때문에 이를 사용할 수 있다.
처음엔 slice, subList를 활용하려고 했는데, 둘 다 반환 값이 List이기 때문에 오류가 발생한다. 특히 n=4일 때 c 간격으로 슬라이싱해야 하는 것도 있어서 windowed()를 활용하려고 했지만 이것도 List...
fun <T> Iterable<T>.windowed(
size: Int,
step: Int = 1,
partialWindows: Boolean = false
): List<List<T>>
slice를 사용하려면 IntArray를 toList()로 변환해야 한다.
val slicedArr = arr.toList().slice(2..8 step 2)
반면에 sliceArray()는 IntArray에서 직접 슬라이싱하여 새로운 IntArray를 반환할 수 있기 때문에 이를 사용하는 게 좋다.
대신 sliceArray()를 마지막 조건에 적용하려면 또 다른 방식이 필요하다. c 간격으로 해야된다는 것때문에 for문을 사용한 풀이도 있었지만, 이왕이면 for문을 사용하지 않고 해보고 싶기 때문에..!
sliceArray는 IntRange 또는 Collection<Int> 를 받기 때문에, a..b step c는 IntProgression이기 때문에 toList로 변환 후에 사용해야 한다.
'코딩테스트' 카테고리의 다른 글
가까운 1 찾기 (0) | 2025.02.10 |
---|---|
99클럽 코테 스터디 8일차 TIL : computeIfAbsent() (0) | 2025.01.24 |
99클럽 코테 스터디 7일차 TIL : HashSet (0) | 2025.01.22 |
99클럽 코테 스터디 6일차 TIL : Hashing (0) | 2025.01.22 |
99클럽 코테 스터디 4일차 TIL : reverse() (0) | 2025.01.16 |