코딩테스트

리스트 자르기

kchabin 2025. 2. 11. 12:12

정수 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로 변환 후에 사용해야 한다.