일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 2022 플러터 설치
- 큐 자바 코드
- 스택 큐 차이
- 안드로이드 유닛 테스트 예시
- jvm 작동 원리
- rxjava hot observable
- jvm이란
- ANR이란
- 안드로이드 os 구조
- 2022 플러터 안드로이드 스튜디오
- Rxjava Observable
- 멤버변수
- 서비스 쓰레드 차이
- rxjava cold observable
- 객체
- 플러터 설치 2022
- 자바 다형성
- 안드로이드 레트로핏 사용법
- android ar 개발
- 스택 자바 코드
- ar vr 차이
- 클래스
- 안드로이드 유닛 테스트
- 안드로이드 라이선스 종류
- 서비스 vs 쓰레드
- 안드로이드 레트로핏 crud
- android retrofit login
- 안드로이드 유닛테스트란
- rxjava disposable
- 안드로이드 라이선스
- Today
- Total
나만을 위한 블로그
[Algorithm] 프로그래머스 - 최댓값 만들기(1) (Kotlin) 본문
정수 배열 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
마지막 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
초기값(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개를 곱한 값을 리턴하게 된다.
'알고리즘 문제 풀이 > 프로그래머스' 카테고리의 다른 글
[Algorithm] 프로그래머스 - 모음 제거 (Kotlin) (0) | 2022.12.29 |
---|---|
[Algorithm] 프로그래머스 - 팩토리얼 (Kotlin) (0) | 2022.12.28 |
[Algorithm] 프로그래머스 - 합성수 찾기 (Kotlin) (0) | 2022.12.28 |
[Algorithm] 프로그래머스 - 주사위의 개수 (Kotlin) (0) | 2022.12.28 |
[Algorithm] 프로그래머스 - 배열 회전시키기 (Kotlin) (0) | 2022.12.28 |