반응형

최근 GDSC에서 또 돌발퀴즈가 나와 문제를 풀어보면서 배워본 것들을 정리하려 합니다.

문제 내용

User라는 데이터 클래스가 있고 users라는 사람들의 이름과 나이가 담겨있는 User타입의 리스트가 있습니다.

메인 함수에서 나이를 입력받으면 users에서 입력받은 나이보다 크거나 같은 사람들의 이름을 내림차순으로 출력해야 합니다.

findUserNamesOverThisAgeDesc() 함수를 이용하여 문제를 해결해야 한다고 합니다.

우선 입력은 readlnOrNull()?. toIntOrNull()로 받게 됩니다.

readlnOrNull() 은 readLine()과 같은 기능을 하는 함수입니다. 그 후 toIntOrNull()을 이용하여 정수형으로 변환시켜주었습니다.

저는 findUserNamesOverThisAgeDesc 함수를 아래와 같이 구성했습니다.

fun List<User>.findUserNamesOverThisAgeDesc(age: Int): List<String> {
    val list = users.filter { it.age >= age }
        .sortedByDescending { it.name }
        .map { it.name }

    return list

}

List<String> 타입을 반환해야하기 때문에 List<String>인 list를 만들어 반환 시켜주었습니다.

filter을 사용하여 입력받은 age보다 크거나 작은 age값을 가진 인원들만 추려냈고 sortedByDescending을 사용하여 그 추려낸 인원들을 이름의 내림차순으로 정렬하였습니다. 그 후 map을 이용하여 name만을 가진 list<String>으로 만들어 list를 만들어주었습니다.

마지막으로 fotEach문과 println()을 사용하여 리스트를 탐색하면 한 줄에 하나씩 조건에 맞는 이름을 출력하도록 만들었습니다.

 

filter와 map에 대한 설명은 아래 글에서 정리 해두었습니다.

2022.02.21 - [코틀린[Kotlin]] - 코틀린[Kotlin] 컬렉션 API : filter, map, all, any, count, find(firstOrNull)

 

 toInt() / toIntOrNull()

toInt() 함수는 문자열을 정수형으로 변환시켜줍니다. ex) string.toInt()

"soopeach"와 같이 정수형으로 변환이 불가능한 문자열은 

Exception in thread "main" java.lang.NumberFormatException: For input string: "soopeach" 에러가 발생합니다.

fun main(){

    val test: String = "1234"
    val Stest = "soopeach"

    // test가 문자열 "1234" 이기 때문에
    // "1234" + "1" = "12341"
    println(test + 1) // 12341 출력

    // test는 toInt()를 사용하여 정수형 1234이기 때문에
    // 1234 + 1 = 1235
    println(test.toInt() + 1) // 1235 출력

    println(Stest.toInt())
    // 정수형으로 변환시킬 수 없는 문자열이기 때문에 에러 발생
    // Exception in thread "main" java.lang.NumberFormatException: For input string: "soopeach" 에러 발생

}

toIntOrNull() 함수는 toInt()와 동일을 기능을 하지만 정수형으로 변환이 불가능한 문자열은 에러가 발생하는 것이 아니라 null을 반환해줍니다.

fun main(){

    val test: String = "1234"
    val Stest = "soopeach"

    // test가 문자열 "1234" 이기 때문에
    // "1234" + "1" = "12341"
    println(test + 1) // 12341 출력

    // test는 toInt()를 사용하여 정수형 1234이기 때문에
    // 1234 + 1 = 1235
    println(test.toIntOrNull()!! + 1) // 1235 출력

    println(Stest.toIntOrNull())
    // null 출력

}

여기서 !!를 해준 이유는 null이 반환된다면 +1을 할 수 없기 때문에 null이 아님을 보장해주기 위해서입니다. 

println(test.toIntOrNull()!! + 1)

제가 작성한 정답 코드

data class User(val name: String, val age: Int)

val users = listOf(
    User("Alice", 16),
    User("Bob", 10),
    User("Carol", 20),
    User("Dave", 32),
    User("Eve", 29),
    User("Frank", 21),
    User("Grace", 41)
)

fun List<User>.findUserNamesOverThisAgeDesc(age: Int): List<String> {
    val list = users.filter { it.age >= age }
        .sortedByDescending { it.name }
        .map { it.name }

    return list

}

fun main() {

    val queryAge = readlnOrNull()?.toIntOrNull()

    users.findUserNamesOverThisAgeDesc(queryAge!!)
        .forEach { println(it) }

}
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기