관리 메뉴

나만을 위한 블로그

[Algorithm] 프로그래머스 - 최댓값 만들기(1) (Kotlin) 본문

알고리즘 문제 풀이/프로그래머스

[Algorithm] 프로그래머스 - 최댓값 만들기(1) (Kotlin)

참깨빵위에참깨빵_ 2022. 12. 28. 22:17
728x90
반응형
정수 배열 numbers가 매개변수로 주어진다. numbers의 원소 중 2개를 곱해 만들 수 있는
최댓값을 리턴하는 solution()을 완성하라

 

 

숫자 2개를 곱해서 만들 수 있는 가장 큰 값을 리턴하면 되기 때문에 리스트를 정렬한 다음 내림차순이면 0번, 1번 요소를 꺼내와 곱하면 되고, 오름차순이면 마지막, 마지막 - 2번 인덱스의 요소를 꺼내와 곱하면 된다.

난 sorted()를 썼기 때문에 아래와 같이 작성했다.

 

class Solution {
    fun solution(numbers: IntArray): Int {
        val list = numbers.sorted()
        val a = list.last()
        val b = list[list.size - 2]

        return a * b
    }
}

 

for문을 사용하진 않았지만 더 짧게 줄일 수 있을 것 같아 "list."까지 입력하고 나오는 함수들을 찾아보다가 takeLast()라는 함수를 쓰면 어떻게 될 것 같았다.

 

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/take-last.html

 

takeLast - Kotlin Programming Language

 

kotlinlang.org

마지막 n개의 요소를 포함하는 리스트를 반환한다 (n : takeLast()의 매개변수)
public fun <T> List<T>.takeLast(n: Int): List<T> {
    require(n >= 0) { "Requested element count $n is less than zero." }
    if (n == 0) return emptyList()
    val size = size
    if (n >= size) return toList()
    if (n == 1) return listOf(last())
    val list = ArrayList<T>(n)
    if (this is RandomAccess) {
        for (index in size - n until size)
            list.add(this[index])
    } else {
        for (item in listIterator(size - n))
            list.add(item)
    }
    return list
}

 

takeLast()는 매개변수로 넣은 숫자만큼 리스트에서 원소들을 빼오는 함수다. 이걸 써서 큰 값 2개를 가져오는 것까지는 성공했지만 이후 코드를 어떻게 줄일지 고민하다가 다른 사람의 풀이를 참고해 보니 fold()라는 함수를 쓰고 있었다.

 

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/fold.html

 

fold - Kotlin Programming Language

 

kotlinlang.org

초기값(Accumulates value)부터 시작해서 왼쪽에서 오른쪽으로 현재 누산기(accumulator) 값과 각 요소에 연산을 적용해 값을 누적한다. 배열이 비어 있으면 지정된 초기값을 리턴한다

매개변수) operation : 현재 누산기 값과 요소를 취하고 다음 누산기 값을 계산하는 함수
public inline fun <T, R> Iterable<T>.fold(initial: R, operation: (acc: R, T) -> R): R {
    var accumulator = initial
    for (element in this) accumulator = operation(accumulator, element)
    return accumulator
}

 

이 함수도 Collections에 속하지만 별도로 import할 필요는 없다. 이걸 쓰면 아래와 같이 작성할 수 있다.

 

class Solution {
    fun solution(numbers: IntArray): Int = numbers.sorted().takeLast(2).fold(1) { acc, i -> acc * i }
}

 

fold()는 매개변수를 받는데 이 매개변수는 초기값을 의미한다. 그리고 뒤의 {} 블럭 안의 코드들을 수행하면서 결과를 누적시키고 그 결과값을 반환한다.

즉 1로 초기값을 선언한 다음 takeLast()로 가져온 2개의 값을 곱해서 리턴하게 되어 가장 큰 숫자 2개를 곱한 값을 리턴하게 된다.

반응형
Comments