프로그래머스 - 최댓값과 최솟값

황인규·2022년 10월 21일
0

알고리즘

목록 보기
2/3

문제 링크

[문제]
최솟값과 최댓값을 찾아라.

[접근 방법]
정렬되지 않은 배열에서 단순히 최솟값과 최댓값을 찾는 문제는 단순하게 선형 탐색을 통해 구할 수 있다.
시간복잡도는 배열의 크기가 N일 때, O(N)
세가지 방법으로 풀이했다.

[첫번째 방법]

class Solution {
    fun solution(s: String): String {
        var minValue = Int.MAX_VALUE
        var maxValue = Int.MIN_VALUE
        val arrOfNum = s.split(" ").map { it.toInt() }

        arrOfNum.forEach {
            minValue = minValue.coerceAtMost(it)
            maxValue = maxValue.coerceAtLeast(it)
        }

        return "$minValue $maxValue"
    }
}

단순하게 공백을 기준으로 문자열을 나누고 값들을 Int형으로 변환한 후에 대소를 비교하는 방법.
split 비용(O(N)) + 선형 검색(O(N))이 들어서 속도는 제일 느리고 메모리적으로도 새로운 크기가 N 배열을 생성하므로 효율적이지 않다.
그러나, 제일 간단하게 떠올리면서 구현하기 쉬운 방법.

[두번째 방법]

class Solution {
    fun solution(s: String): String {
        var minValue = Int.MAX_VALUE
        var maxValue = Int.MIN_VALUE
        var isMinus = false

        var currentNum = 0
        for (it in s) {
            if (it == ' ') {
                if (isMinus) currentNum *= -1

                minValue = minValue.coerceAtMost(currentNum)
                maxValue = maxValue.coerceAtLeast(currentNum)

                currentNum = 0
                isMinus = false
            } else if (it == '-') {
                isMinus = true
            } else if (it in '0'..'9') {
                currentNum = currentNum * 10 + it.digitToInt()
            }
        }

        if (isMinus) {
            currentNum *= -1
        }
        minValue = minValue.coerceAtMost(currentNum)
        maxValue = maxValue.coerceAtLeast(currentNum)

        return "$minValue $maxValue"
    }
}

문자열을 하나씩 탐색하면서 공백(' ')이 나오면 지금까지 구한 숫자(currentNum)를 최댓값과 최솟값과 비교하여 만약, 더 작거나 큰 값이라면 최댓값 최솟값을 갱신한다.
단, 마지막 숫자는 공백을 만나지 못하므로 따로 처리가 필요하다.
예 : [1 2 3 4 5]면 5는 공백을 만나지 못하므로 따로 처리가 필요하다.

[세번째 방법]

class Solution {
    fun solution(s: String): String {
        var minValue = Int.MAX_VALUE
        var maxValue = Int.MIN_VALUE
        var isMinus = false

        var currentNum = 0
        for (it in s) {
            if (it == ' ') {
                if (isMinus) {
                    currentNum = currentNum.inv() + 1
                }

                minValue = minValue.coerceAtMost(currentNum)
                maxValue = maxValue.coerceAtLeast(currentNum)

                currentNum = 0
                isMinus = false
            } else if (it == '-') {
                isMinus = true
            } else if (it in '0'..'9') {
                currentNum = currentNum * 10 + it.digitToInt()
            }
        }

        if (isMinus) {
            currentNum = currentNum.inv() + 1
        }
        minValue = minValue.coerceAtMost(currentNum)
        maxValue = maxValue.coerceAtLeast(currentNum)

        return "$minValue $maxValue"
    }
}

음수로 바꿀 때, 보수를 사용하는 방법. 그냥 갑자기 대학교 때 들은 수업이 생각나서 해본 방법.
두번째 방법이랑 다를 게 없다.

[마지막 방법]

class Solution {
    fun solution(s: String): String = s.split(" ").map { it.toInt() }.let { "${it.min()} ${it.max()}" }
}

다른 사람 답을 참고한 방법이다. 평소 숏코딩을 가독성 좋아하지 않지만, 충분히 직관적이고 코드도 깔끔해서 좋은 방법 같다.

0개의 댓글