제일 작은 수 제거하기

KSang·2023년 12월 1일
0

[Kotlin]코드카타

목록 보기
28/100

🕵️문제설명

정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.

⚠️제한조건

arr은 길이 1 이상인 배열입니다.
인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다

🤔 알고리즘 생각해보기

일단 사용자로부터 배열을 입력받아야 한다

10 12 5 14 15 이런식으로 ' ' 띄어쓰기를 기준으로 배열을 구분해서 입력받게 하는 변수가 필요

i ≠ j이면 arr[i] ≠ arr[j] 임으로 중복되는 숫자가 없게하자

sort()를 써 오름차순으로 정리하고 첫번째 숫자를 빼줄까?

그러면 배열을 다시 나열할때 순서가 바껴서 배열이 바뀔것이니

오름차순으로 작은수를 찾을 배열하나 원본 배열하나를 만들고

작은수를 변수에 넣은후 같은값이 있다면 빼는걸로하자

🔎 진행 과정

main

사용자로부터 배열부터 입력받자

fun main() {
    println("띄어쓰기를 이용해 배열을 입력하세요 ex)10 29 32 24")
    val input = readln()
    val arr = input.split(' ')?.map { it.toInt() }?.distinct()?: emptyList()
}

split을 이용해 공백' '을 구분자로 배열을 만들었고 map을 이용해 정수로 받았다

distinct를 써 중복되는 값은 제거하도록 만들었다

?: emptyList는 null이거나 변환에 실패할시 빈 리스트가 할당되게 했다

solution

fun solution(arr: List<Int>): IntArray {
    var answer = IntArray(arr.size -1)
    var arr2:IntArray = arr.toIntArray()
    var i = 0
    var j = 0

    if (answer.size == 0){
        answer = intArrayOf(-1)
    }

    arr2.sort()

    while (i < arr.size){
        if (arr[i] == arr2[0]) {
            i++
            continue
        }
        answer[j] = arr[i]
        i++
        j++
    }

    return answer
}

사용자로부터 입력 받은 리스트의 크기 -1 만큼의 사이즈로 리턴할 리스트를 만들었다

가장 작은 수를 빼면 크기가 1만큼 줄어들것이고 만약 사용자가 수를 하나밖에 입력하지 않았을경우

리스트에 -1을 추가해서 리턴하게 만들었다

입력받은 리스트와 같은 리스트를 새로 만든 후 오름차순을 이용해 가장앞에 최소값이 오게하고

반복문을 통해 입력받은 리스트를 리턴 리스트에 옮기면서 최소값은 옮기지 않게했다

🤔 그런데 만들면서 뭔가 되게 늘어놓아서 과정을 진행하는것 같다는 생각이 들었다
이렇게 만들어도 작동이 되긴한다만 정석적인 방식은 아닌것 같다
내가 생각하지 못하거나 알지못한 문법같은게 있지 않을까?

💡min을 이용해 최소값을 구해주고 fiter를 써 반복문없이 return값에 넣어주면되겟다

일단 최소값을 정의 해주자

var min = arr.minOrNull?: return intArray(-1)

사용자가 입력한 리스트의 최소값을 min변수에 넣어주고 입력한 정수가 없으면 -1을 리턴한다

이제 입력한 리스트를 리턴 리스트에 넣을건데 filter를 통해 min은 안넣을거다

    var answer = arr.filter { it != min }.toIntArray()
    if (answer.isEmpty()) return intArrayOf(-1)

arr리스트에서 answer로 옮기면서 옮기는 객체 it이 min이 아닐때 옮기게 해준다

그리고 입력받은 리스트에 정수가 하나밖에 없어 answer가 비어있을경우 -1을 리턴하게 해주면 끝

📌최종 결과

package com.example.codekata

fun main() {
    println("띄어쓰기를 이용해 배열을 입력하세요 ex)10 29 32 24")
    val input = readln()
    val arr = input.split(' ')?.map { it.toInt() }?.distinct()?: emptyList()
    println("${solution(arr).contentToString()}")
}

fun solution(arr: List<Int>): IntArray {
    var min = arr.minOrNull()?: return intArrayOf(-1)
    var answer = arr.filter { it != min }.toIntArray()
    if (answer.isEmpty()) return intArrayOf(-1)

    return answer
})

0개의 댓글