문제 설명
문자열 s에는 공백으로 구분된 숫자들이 저장되어 있습니다. str에 나타나는 숫자 중 최솟값과 최댓값을 찾아 이를 "(최솟값) (최댓값)"형태의 문자열을 반환하는 함수, solution을 완성하세요.
예를 들어 s가 "1 2 3 4"라면 "1 4"를 리턴하고, "-1 -2 -3 -4"라면 "-4 -1"을 리턴하면 됩니다.
제한 조건
- s에는 둘 이상의 정수가 공백으로 구분되어 있습니다.
입출력 예
s | return |
"1 2 3 4" | "1 4" |
"-1 -2 -3 -4" | "-4 -1" |
"-1 -1" | "-1 -1" |
풀이
"문자열"을 받아 "비교" 후 "문자열"을 리턴해주면 됩니다. 제한조건에서 둘 이상의 "정수"라고 명시했기 때문에 타입은 Int로 고정할 수 있습니다.
class Solution {
fun solution(s: String): String {
var max = Int.MIN_VALUE
var min = Int.MAX_VALUE
s.split(" ").forEach{
var num = it.toInt()
if(num > max)
max = num
if(num <= min)
min = num
}
return "$min $max"
}
}
min과 max의 기본값을 각각 MAX_VALUE와 MIN_VALUE로 설정하고 문자열을 공백으로 나눠 한 번 반복해줍니다.
반복 시 최솟값과 최댓값을 걸러내는데 if else를 쓰지 않고 if 문 2개로 걸러줍니다.
if else를 쓸 경우 조건문이 한 개라 순차적으로 증가하는 문자열 ex) "1 2 3 4" 일 경우 min값을 거르지 못해 "2147483647 4"라는 결괏값이 나오게 됩니다.
다른 사람의 풀이
코드를 간결하게 한 줄로 사용한 케이스입니다.
리스트에 정수형으로 맵핑한 다음 최소값과 최댓값을 찾는 함수로 출력한 예제입니다.
fun solution(s: String): String = s.split(" ").map { it.toInt() }.let { "${it.minOrNull()} ${it.maxOrNull()}" }
그냥 if문을 사용한 것에 비해 시간이 더 걸린 것을 볼 수 있습니다.
이유를 추측해보자면 List를 만들고 함수로 최소 최대값을 찾는데 시간이 걸리는거 같습니다.
확인해봅시다
코틀린의 Collections클래스에 map 함수입니다. ArrayList를 생성하고 리턴하는 것을 볼 수 있습니다.
public inline fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> {
return mapTo(ArrayList<R>(collectionSizeOrDefault(10)), transform)
}
기존 함수인 min과 max는 사용 중단되었기 때문에 minOrNull, maxOrNull을 사용했습니다.
@Deprecated("Use maxOrNull instead.", ReplaceWith("this.maxOrNull()"))
@Deprecated("Use minOrNull instead.", ReplaceWith("this.minOrNull()"))
@SinceKotlin("1.4")
public fun CharSequence.minOrNull(): Char? {
if (isEmpty()) return null
var min = this[0]
for (i in 1..lastIndex) {
val e = this[i]
if (min > e) min = e
}
return min
}
@SinceKotlin("1.4")
public fun CharSequence.maxOrNull(): Char? {
if (isEmpty()) return null
var max = this[0]
for (i in 1..lastIndex) {
val e = this[i]
if (max < e) max = e
}
return max
}
코드를 살펴보면 if else문으로 짠 코드와 크게 다르지 않은 것을 볼 수 있습니다. 차이점은 리스트를 2번 반복하기 때문에 조금 더 오래 걸리는 것입니다. 시간 복잡도로 보면 n과 2n의 차이라고 볼 수 있네요
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
이진변환 반복하기(Lv.2) (0) | 2022.09.16 |
---|---|
JadenCase 문자열 만들기(Lv.2) (1) | 2022.09.15 |
베스트 앨범 (0) | 2022.06.13 |
카펫 (0) | 2022.06.13 |
소수찾기 (0) | 2022.06.13 |