본문 바로가기

내일배움캠프 안드로이드 3기

[TIL] 24.01.16

1. 알고리즘 문제 해결

 

키로거(백준 5397):

 자료 구조 기반 단순 구현문제. 커서 좌우 부분을 각각 스택으로 나누어 해결했다. 링크드 리스트로 해결해도 무난할 것 같다.

 

 

PPAP(백준 16120):

 처음에는 KMP 알고리즘이나 보이어-무어 알고리즘 같은 스트링 매치 알고리즘을 이용하려고 했다. 문자열 내에서 "PPAP"를 찾아 "P"로 변경하려는 생각이었다. 그런데 입력으로 들어오는 문자열의 최대 길이가 1,000,000인데, 변경된 문자열을 계속해서 탐색-변경 해줘야해서 시간 초과가 날 것 같았다.

 그리고 문자열의 대부분이 같은 글자이고, 탐색해야 하는 Substring의 접두사와 접미사가 같기 때문에 스트링 매치 알고리즘들이 큰 효과를 보이지 않을 거 같기도 했다.

 그래서 스택을 이용했다. 스택에 쌓인 상위 3개 원소와 입력 받은 문자를 포함해 "PPAP"가 이뤄지면 스택에 "P"를 집어넣고, 아니라면 뺐던 원소들과 입력받은 문자를 그대로 집어넣었다. O(n)의 시간복잡도로 무난하게 패스했다.

 

실수했던 부분: while(!cin.eof) {} 사용과 동시에, 입력을 블럭 내 처음 부분에서 받도록 짰음 -> eof가 입력 값으로 주어진 상태에서도 블럭 내 코드 1회 반복됨

 

 

 

2. 안드로이드 공부

 

 기존에 하던 공부가 있어서 그걸 계속해서 진행하기로 했다. 테마를 지정할 수 있는 영화 리뷰 앱을 간단하게 구현하는 것이었는데, 듣고 있던 Compose 강의에서 다루고 있는 내용이다. 

@Composable
fun MovieAppTheme(
    darkTheme: Boolean = isSystemInDarkTheme(),
    // Dynamic color is available on Android 12+
    dynamicColor: Boolean = true,
    content: @Composable () -> Unit
) {
    val colorScheme = when {
        dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
            val context = LocalContext.current
            if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context)
        }

        darkTheme -> DarkColorScheme
        else -> LightColorScheme
    }
    val view = LocalView.current
    if (!view.isInEditMode) {
        SideEffect {
            val window = (view.context as Activity).window
            window.statusBarColor = colorScheme.primary.toArgb()
            WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme
        }
    }

    MaterialTheme(
        colorScheme = colorScheme,
        typography = Typography,
        content = content
    )
}

 

 기본 생성된 ui/theme 내의 Theme.kt 파일의 일부인데, Material2 기반의 강의 내용과는 다르게 Material3를 이용하는 최신 안드로이드 프로젝트의 경우 Dynamic color를 지원하기 위해 버전 분기처리가 되어 있었다. 그 밖에도 구조적인 차이가 커서 강의에서 다루는 코드를 마이그레이션 해야할 것 같은데, 생각보다 테마가 적용되는 방식이나 디테일 차이가 커서 강의에서 알려주는 구조대로 커스텀하긴 힘들 것 같았다. 차라리 다음에 Android Developers의 문서를 참조해서 Material3 방식으로 커스텀 해보는게 더 쉽지싶다.

 그래서 일단은 테마 관련 부분은 오버라이딩과 상수 설정으로 가볍게 넘어가고, Compose를 통한 UI 구현을 신경써서 보기로 했다.

 

 이와 같은 방식으로 여러 버튼들을 만들었는데, 확실히 xml 베이스로 커스텀뷰를 디자인하는 것보다 품이 훨씬 덜 든다. 레이아웃과 속성값을 xml로 지정하고 클래스 파일도 따로 생성해줘야 하는 기존 방식과 달리 코틀린 코드 내에서 Composable 함수만 적절히 구현해주면 된다. 아직은 Compose 기반으로 개발하는게 조금 어색하지만 익숙해지면 생산성은 확실히 좋아질 것 같다.

 그리고 @XXXRes 어노테이션에 대해서도 알게 되었는데, 찾아보니 리소스 id를 리소스 타입별로 감지해서 제한할 수 있다고 한다. 큰 규모나 여럿이서 할 수 있는 프로젝트에서는 꽤 도움될 것 같다.

'내일배움캠프 안드로이드 3기' 카테고리의 다른 글

[TIL] 24.01.20  (0) 2024.01.20
[TIL] 24.01.19  (0) 2024.01.19
[TIL] 24.01.18  (0) 2024.01.18
[TIL] 24.01.17  (0) 2024.01.17
스타터 노트  (0) 2024.01.15