huzit
___을 입력해주세요
huzit
전체 방문자
  • 분류 전체보기 (137)
    • 안드로이드(Compose) (10)
      • UI (4)
      • 개념 (6)
    • 안드로이드 (50)
      • 기본개념 (6)
      • 응용 (4)
      • Debug (18)
      • Binding (3)
      • RecyclerView (5)
      • Firebase (6)
      • Retrofit (1)
      • Activity & Fragment (4)
    • 코틀린 (22)
    • 코딩테스트 (38)
      • 백준 (10)
      • 프로그래머스 (28)
    • 일상 (6)
    • CS 지식 (4)
    • 라즈베리파이 (7)

블로그 메뉴

  • 홈
  • 태그
  • 글쓰기
  • 관리

공지사항

인기 글

태그

  • docker
  • gts4mini
  • Debug
  • Kotlin
  • compose
  • 라즈베리 파이
  • 공돌카돈
  • 공돌이파파
  • Retrofit
  • 프로그래머스
  • FCM
  • recyclerView ClickEvent
  • Android
  • firebase
  • 브레빌 밤비노 플러스
  • jetpack
  • Java
  • RecyclerView
  • 코틀린
  • IFTTT

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
huzit

___을 입력해주세요

최댓값과 최솟값(Lv.2)
코딩테스트/프로그래머스

최댓값과 최솟값(Lv.2)

2022. 9. 14. 12:49
728x90

문제 설명

문자열 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를 썼을 경우

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의 차이라고 볼 수 있네요

728x90
저작자표시 (새창열림)

'코딩테스트 > 프로그래머스' 카테고리의 다른 글

이진변환 반복하기(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
    '코딩테스트/프로그래머스' 카테고리의 다른 글
    • 이진변환 반복하기(Lv.2)
    • JadenCase 문자열 만들기(Lv.2)
    • 베스트 앨범
    • 카펫
    huzit
    huzit
    simple is best

    티스토리툴바