쉽게 다가가는 최신 프로그래밍: 코틀린 - 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) { ... }
'코틀린' 카테고리의 다른 글
코틀린: infix expression을 prefix expression으로 변환(1/5) - 문자열 방식 (0) | 2025.01.09 |
---|---|
코틀린: 5장 테스트에 도전해 보세요 (정답 해설) (0) | 2025.01.09 |
코틀린: 시퀀스(Sequence)와 컬렉션(Collection)은 뭐가 다를까요? (0) | 2025.01.09 |
코틀린: Comparable 인터페이스와 Comparator 인터페이스 (0) | 2025.01.09 |
코틀린: fold와 reduce - 누적 합과 누적 곱 (0) | 2025.01.09 |