코틀린/코딩테스트

코딩테스트 [배열 자르기]

정혜현 2024. 6. 21. 09:55

문제

정수 배열 numbers와 정수 num1, num2가 매개변수로 주어질 때, numbers의 num1번 째 인덱스부터 num2번째 인덱스까지 자른 정수 배열을 return 하도록 solution 함수를 완성해보세요.

 

https://school.programmers.co.kr/learn/courses/30/lessons/120833


 

풀이

1. 접근

1.1 관찰

특정 인덱스만 반환하는 문제

입력 : 배열(정수), 정수, 정수

출력 : 배열(정수)

 

1.2 계획 

배열을 인덱스번호로 자르는 메소드가 필요하다.

배열자르기 : slice()

answer에 담기 : 리턴

 

 

 

2. 시행착오

2.1 시도

 

class Solution {
    fun solution(numbers: IntArray, num1: Int, num2: Int): IntArray {
        var answer: IntArray = intArrayOf()
        answer = numbers.slice(num1..num2)
        return answer
    }
}

 

검증결과 : 실패. 타입미스매치 오류

/Solution.kt:4:18: error: type mismatch: inferred type is List<Int> but IntArray was expected
        answer = numbers.slice(num1..num2)
                 ^

 

원인분석 : slice는 list를 새로 만들어 반환한다. answer는 array이므로 맞지 않다. 

 

해결방안 : toIntArray()로 형 변환을 해준다. 코드도 최대한 줄였다.

class Solution {
    fun solution(numbers: IntArray, num1: Int, num2: Int): IntArray = numbers.slice(num1..num2).toIntArray()
}

 

검증결과 : 성공

 

아예 배열을 자르는 메소드도 있었다. sliceArray()

class Solution {
    fun solution(numbers: IntArray, num1: Int, num2: Int): IntArray = numbers.sliceArray(num1..num2)
}

 

 

 

인덱스 번호로 범위를 지정해 추출하는 메소드

메소드 명 범위 입력방법 반환값 특징
slice() Int..Int 새로운 list ..대신 until가능(끝범위 미포함)
sliceArray() Int..Int 새로운 Array ..대신 until가능(끝범위 미포함)
copyOfRange() Int, Int 새로운 Array 끝범위 미포함(until같다)
subList() Int, Int 원본 list 원본 반환이라 입력도 list여야 한다.

 

 

찾다보니 같이 자주 나오는 메소드

take() Int 새로운 list 앞에서 () 인덱스 개수만큼 가져온다.
drop() Int 새로운 list 앞에서 인덱스 개수만큼 버린다.

 

while{}과 last()를 붙여 사용할 수 있다.

 

 


회고

 

구글링만 해보다가 공식문서를 보게 됐는데 예상외로 알기 쉽게 되어있었다. '공식문서'라는 타이틀에 막연한 거부감이 들어 그동안 들어가 볼 생각을 안했는데 자주 봐야되겠다.