문제
정수 배열 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()를 붙여 사용할 수 있다.
회고
구글링만 해보다가 공식문서를 보게 됐는데 예상외로 알기 쉽게 되어있었다. '공식문서'라는 타이틀에 막연한 거부감이 들어 그동안 들어가 볼 생각을 안했는데 자주 봐야되겠다.
'코틀린 > 코딩테스트' 카테고리의 다른 글
코딩테스트 [모음 제거] (0) | 2024.06.24 |
---|---|
코딩테스트 [편지] (0) | 2024.06.24 |
코딩테스트 [자릿수 더하기] (0) | 2024.06.20 |
코딩테스트 [n의 배수 고르기] (0) | 2024.06.20 |
코딩테스트 [가장 큰 수 찾기] (0) | 2024.06.19 |