Android/Algorithm

[프로그래머스 / Kotlin] 제일 작은 수 제거하기

정생강 2024. 3. 6. 21:16

[프로그래머스 / Kotlin] 제일 작은 수 제거하기

 

문제 설명

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

- 제한 조건

arr은 길이 1 이상인 배열입니다.

인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.

 

해결 방법

- 문제 발생!

처음 문제를 읽고 전에 풀었던 문제와 같은 유형이라고 생각했다. 배열을 내림차순 한 후 마지막 요소만 빼고 새로운 배열에 저장하면 되는 문제라고 생각한 것이다. 이 생각을 가지고 코드를 작성하였고 예제케이스를 성공하였지만 제출 테스트 코드에서 모두 실패가 나오고 말았다.(아니 왜??) 다시 코드를 읽어봐도 문제가 없었고 20분간 헤매다 문제를 다시 보니 아차! 내림 차순 한 후 return하면 안되고 입력받은 배열에서 제일 작은 수만 빼고 그 상태 그대로 반환해야 하는 것이다.

//잘못 구현한 코드
class Solution {
    fun solution(arr: IntArray): IntArray {
        var num = intArrayOf()
        arr.sortDescending()
        
        for(i in 0 until arr.size-1) num += arr[i]
        
        if(num.isEmpty()) num = intArrayOf(-1)
        
        return num
    }
}

 

그러니 테스트 케이스에서 실패가 뜰 수 밖에.. 예제는 다 내림차순으로 설정되어 있어서 범했던 오류이다. 그렇다면 어떻게 구현해야할까? 우선 내림차순을 하지 않고 배열에서 가장 작은 수를 찾는 방법을 생각해 보았다. min()함수를 사용하면 작은 수를 구할 수 있을 것 같다.

 

- 2번째 문제 발생!

//문제 발생!!
class Solution {
    fun solution(arr: IntArray): IntArray {
        var num = intArrayOf()
        var min = arr.min()
        
        for(i in 0 .. arr.size){
            if(i == arr.indexOf(min)) continue
            num += arr[i] 
        }
        
        if(num.isEmpty()) num = intArrayOf(-1)
        
        return num
    }
}

 

두번째 문제를 직면했다. 프로그래머스에서 min()이 작동하지 않는다. minOrNull()은 작동하는데 이를 사용하면 if 조건식에서 널값이 들어갈 수 있어 에러가 발생하는 것이다. 이제 방법은 두가지이다. 첫번째는 filter을 사용하여 배열에서 가장 작은값을 제거하는 것이고 두번째는 array를 list로 변환하여 remove를 통해 가장 작은 수를 제거하는 것이다.

 

- 해결

첫번째 방법을 택하였다. filter는 배열에서 사용 가능한데  filter뒤에 오는 조건식에 만족하는 (true를 가져오는) 값들을 모은 리스트를 반환해주는 방식이다.

 

내가 푼 코드

class Solution {
    fun solution(arr: IntArray): IntArray {
        var answer = intArrayOf()
        
        answer = arr.filter {it != arr.minOrNull()}.toIntArray()
        
        if(answer.isEmpty()) answer += -1
        
        return answer
    }
}

 

후기

이 문제를 해결하는데 꽤 오래걸렸다. min()을 사용하여 풀고 싶어서 이것 저것 찾아보며 도전하다보니 시간이 많이 끌린 것 같다. android studio에선 제대로 돌아가는데.. 프로그래머스에서 안된다면 어쩔 수 없지..

 

반성할건 문제를 잘 읽을 것! 이번에도 문제를 잘 읽지 않아 15분 정도 시간을 버린 것 같다.

오늘 사용한 filter도 복습하면 좋을 것 같다.