TIL/알고리즘

02/05 알고리즘 공부(29) - 가장 작은 수 제거하기

sos000303 2024. 2. 5. 15:17
728x90

조건

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

알고리즘 예상

  1. 인덱스 i,j에 관한 조건에서 입력되는 배열은 중복된 원소가 없는 배열임을 알 수 있다.
  2. arr의 최솟값을 변수에 저장한다.
  3. 필터를 이용해 answer에 최솟값을 제외한 원소를 넣는다.
  4. answer가 비어있으면 answer에 -1을 넣는다.

초기 코드

class Solution {
    fun solution(arr: IntArray): IntArray {
        var answer = intArrayOf()
        return answer
    }
}

 

내 코드

class Solution {
    fun solution(arr: IntArray): IntArray {
        var answer = intArrayOf()
        var minVal = arr[0]
        for(i in arr){
            if(minVal > i) minVal = i
        }
        answer = arr.filter { it != minVal }.toIntArray()
        if(answer.isEmpty()) answer += -1
        return answer
    }
}

처음에 var minVal = arr.min()을 사용했는데 레퍼런스 오류라며 실행이 되지 않아 for문을 이용한 방법으로 방향을 바꾸었다.

다른 사람의 풀이

class Solution {
    fun solution(arr: IntArray): IntArray = if(arr.size == 1) arrayOf(-1).toIntArray() 
                                            else arr.filter { it != arr.min() }.toIntArray()
}

 

개선점 또는 배운점

  1. min()은 이제 사용이 안되고 minOrNull()이나 min()!!을 이용해 null값에 대한 예외처리를 해야한다고 한다.
  2. 코드박스를 사용하지 않은 풀이가 꽤나 보였다. 저 방식도 익숙해질 필요가 있다.
  3. for문을 이용한 방법보다 minOrNull()을 이용한 방법이 2배가까운 시간이 걸렸다.
  4. 조건문을 사용하는 시점이 answer배열을 저장한 후가 아닌 저장 전에 arr의 길이를 받아 사용하는 편이 좋을 것 같다.

 

개선된 코드

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