안드로이드/리팩토링

[안드로이드] Linear Calendar에서 offset 검색 최적화

닉네임못짓는사람 2025. 12. 23. 23:02
반응형

프로젝트에서 가로 선형의 달력을 최적화 해보았다.

 

달력이 있는 화면으로 이동시 현재 선택한 날짜가 스크롤 가장 앞에서 보여져야 하는데,

데이터는 Month와 LocalDateTime리스트 형식으로 되어있고

이후 현재 선택중인 날짜의 offset을 찾기위해 전체 map을 flat형태로 변환한 뒤 찾도록 되어있었다.

 

코드로 표현하면 아래 같은 형태

fun getOffset(monthList: List<MonthGroup>, selectedDate: LocalDateTime): Int {
    val flatten = monthList.flatMap { it.dates }
    val dayOffset = flatten.indexOfFirst {
        it.date == selectedDate.date
    }.takeIf { it != -1 } ?: 0

    //  calendar에 month가 stickyHeader로 있기 때문에 month 추가
    val monthDiff = (monthList.indexOfFirst {
        it.month == selectedDate.month.number
    }.takeIf { it != -1 } ?: 0) + 1

    return dayOffset + monthDiff
}

위 구조는 전체 리스트를 flat으로 한 번 평탄화하고 여기서 일치하는 날짜를 찾는 부분에서 비용이 발생한다.

시간 복잡도는 O(n)

 

이 부분을 없애기 위해 아래처럼 바꿔보았다.

fun getOffset(selectedDate: LocalDateTime): Int {
    val now = getToday()
    val dayDiff = (selectedDate.date - now.date).days
    val monthDiff = (selectedDate.year - now.year) * 12 + (selectedDate.month.number - now.month.number)

    return dayDiff + monthDiff
}

현재 서비스에서 오늘을 첫 날로 미래 날짜만 보여주기 때문에

위와 같이 산술 연산만 수행하는 구조로 리팩토링했다.

이 경우 시간 복잡도는 O(1)이 된다.

반응형