본문 바로가기

코틀린

코틀린: 5장 테스트에 도전해 보세요

쉽게 다가가는 최신 프로그래밍: 코틀린 - 5장 배열과 컬렉션을 완전히 이해했나요? 다음 문제를 풀어 보세요.

문제 1  4개의 Person 타입 객체를 갖는 시퀀스 heroes 를 생성했습니다. 
(1) 나이가 가장 젊은 객체를 찾으세요.
(2) 이름 순으로 객체를 정렬하세요.
(3) 미혼인 객체를 모두 찾으세요.
(4) 객체의 평균 나이를 구하세요.

class Person(val name: String,
             val age: Int,
             val gender: Char,
             val martialStatus: Boolean)  {
    override fun toString() = "$name $age $gender $martialStatus"
}

fun main() {
    val heroes = sequenceOf(
        Person("홍길동", 21, 'M', false),
        Person("신사임당", 47, 'F', true),
        Person("유관순", 18, 'F', false),
        Person("임꺽정", 33,'M', true))
        
    // 여기에 코드를 작성하세요    
}

 

문제 2  문제 1의 시퀀스 객체 heroes에서 성이 '홍'씨이고, '미혼'인 사람을 찾으려면 어떻게 할까요? 한 가지 재미있는 방법은 검색 조건을 아래처럼 클래스로 만들어 사용하는 것습니다. 최종 검색은 클래스 FindPersonFilters의 메소드 foundPerson()에서 구현하면 됩니다.

class FindPersonFilters {
    var familyName: String = ""
    var married: Boolean = false
    fun foundPerson(): (Person) -> Boolean { ...  }
}

 

문제 3 아래 코드는 정수 배열 [10, 20, 30]을 각각 16진수 [A, 14, 1E] 로 변환하는 프로그램입니다. 

fun main() {
    println(byteArrayOf(10, 20, 30).map{ it.toString(16) }) // [a, 14, 1e]
}

위 코드를 참고하여  1부터 시작해 3의 배수를 생성하는 시퀀스([1, 3, 9, 27, 81]를 생성하고, 이 시퀀스를 3진수로 변환하세요. 단,  (1, 1), (3, 10), (9, 100), ... 과 같이 10진수 숫자와 3진수 숫자를 같이 출력해야 합니다.

fun main() {
    val seq = generateSequence(1) { if (it > 90) null else it*3 }
    println(seq.toList()) // [1, 3, 9, 27, 81]
    // 여기에 코드를 작성하세요
}

 

문제 4 리스트 컬렉션 객체 stat 는 어떤 사이트(site)의 웹/앱 방문 통계 데이터를 저장하고 있습니다. 이를 위해 2개의 enum class(SNS, OS)와 1개의 data 클래스(VisitorStatistics)를 정의하고 있습니다.
(1) 운영체제 Windows를 사용해 접속한 사용자들의 평균 방문 시간(duration) 을 구하세요.
(2) 월별 방문 건수 최대인 원소를 구하세요.
(3) mobile 운영체제(ANDROID, IOS)를 사용해 접속한 사례 중 월별 방문 건수가 최대인 원소를 구하세요.
(4) 주별 방문 건수의 총합을 구하세요.

enum class SNS { CACAO, FACEBOOK, TWITTER, YOUTUBE, INSTAGRAM }
enum class OS { WINDOWS, MAC, ANDROID, IOS }

data class VisitorStatistics (
    val weeklyVisit: Int, // 주별 방문 건수
    val monthlyVisit: Int, // 월별 방문 건수
    val duration: Double, // 평균 방문 시간(단위: 분)
    val os: OS,    
    val sns: SNS
)

val stat = listOf(
    VisitorStatistics(61, 225, 11.8, OS.WINDOWS, SNS.CACAO),
    VisitorStatistics(86, 347, 12.3, OS.IOS, SNS.INSTAGRAM),
    VisitorStatistics(98, 391, 12.5, OS.ANDROID, SNS.INSTAGRAM),
    VisitorStatistics(76, 248, 16.7, OS.MAC, SNS.YOUTUBE),
    VisitorStatistics(59, 233, 16.9, OS.ANDROID, SNS.YOUTUBE),
    VisitorStatistics(82, 251, 17.4, OS.WINDOWS, SNS.YOUTUBE),
    VisitorStatistics(11, 27, 8.6, OS.WINDOWS, SNS.FACEBOOK),
    VisitorStatistics(3, 15, 5.1, OS.IOS, SNS.TWITTER),
)

 

문제 5 문제 4의 답을 메소드 체이닝(method chaining) 방식으로 구현했다면 이를 확장 함수로 구현해 보는 문제입니다.
(1) 문제 4의 "
(1) 운영체제 Windows를 사용해 접속한 사용자들의 평균 방문 시간(duration) 을 구하세요."을 아래처럼 확장 함수로 구현해 보세요

fun List<VisitorStatistics>.avgDuration(os: OS) { ... }


(2) (1)번의 확장 함수에서는 형식 인자 os를 사용했습니다. 이 함수는 문제 4의 (3) " mobile 운영체제(ANDROID, IOS)를 사용 ..." 문제를 해결할 때 적용하기 불편합니다. 아래처럼 함수 타입을 선언하는 방식으로 수정해서 문제 4의 (3)을 구현해 보세요.

fun List<VisitorStatistics>.avgDuration(func: (VisitorStatistics) -> Boolean) { ... }