제일 작은 수 제거하기

jericho·2023년 12월 11일

PS(문제풀이)

목록 보기
4/12

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

배열에서 가장 작은 수를 제거한다. 비어있다면 -1을 채워 반환.

처음엔 정렬할 생각이 들었는데 순서는 바뀌면 안되어서 그냥 정직하게 탐색하기로 했다.

 - 풀이 1
fun solution(arr: IntArray): IntArray {
    var mn = 0x7fffffff
    var id = 0
    for (i in 0 until arr.size) {
        if (arr[i] < mn) {
            mn = arr[i]
            id = i
        }
    }
    return arr.sliceArray(0 until id) + arr.sliceArray(id + 1 until arr.size) }

제거한 원소 앞뒤로 배열을 슬라이싱해서 합쳐줬다.
(비어있으면 -1 채우는 부분을 안해서 틀림)

 - 풀이 2
fun solution(arr: IntArray): IntArray {
    var mn = 0x7fffffff
    var id = 0
    for (i in 0 until arr.size) {
        if (arr[i] < mn) {
            mn = arr[i]
            id = i
        }
    }
    val answer = arr.copyOfRange(0, id) + arr.copyOfRange(id + 1, arr.size)
    if (answer.size == 0) return IntArray(1) { -1 }
    return answer }

sliceArray는 내부적으로 copyOfRange를 호출하는 것을 보고 이를 직접 호출함.

 - 풀이 3
fun solution(arr: IntArray): IntArray {
    if (arr.size == 1) return intArrayOf(-1)
    var mn = 0x7fffffff
    var mnid = 0
    arr.forEachIndexed { i, v ->
        if (v < mn) {
            mn = v; mnid = i
        }
    }
    return arr.copyOfRange(0, mnid) + arr.copyOfRange(mnid + 1, arr.size) }

forEachIndexed로 인덱스와 값을 함께 받아옴.
비어있는지 확인하는 대신 처음에 사이즈 1이면 바로 반환.

 - 풀이 4
fun solution(arr: IntArray): IntArray =
    if (arr.size == 1) intArrayOf(-1) else run {
        var mn = 0x7fffffff; var mnid = 0
        arr.forEachIndexed { i, v -> if (v < mn) { mn = v; mnid = i } }
        arr.copyOfRange(0, mnid) + arr.copyOfRange(mnid + 1, arr.size) }

run블록 적용, 표현식 함수.

0개의 댓글