5월, 2023의 게시물 표시

Android Use a DiffUtil

이미지
사용 언어: Kotlin 1.8.10 사용 버전: Android Studio Flamingo 2022.2.1 Patch 1 ​ 안드로이드 Use a DiffUtil을 알아보겠습니다. ​ DiffUtil은 두 개의 List를 비교하여 다른 것이 있는지 찾고 업데이트를 하는 기능을 합니다. 보통 RecyclerView Adapter에 많이 사용합니다. ​ 리스트가 크다면, Main thread에서 사용하지 말고, Background에서 실행하고 DiffResult를 받으라고 권고합니다. ​ 아래는 DiffUtil 문서입니다. ​ https://developer.android.com/reference/androidx/recyclerview/widget/DiffUtil 원래는 RecyclerView Adapter에 DiffUtil.ItemCallback()만 사용하면 충분한데요. 지금 알 수 없는 버그가 발생해서 그냥 DiffUtil.Callback()을 사용하기로 했습니다. ​ DiffUtil.ItemCallback의 사용법은 RecyclerView 게시글을 보시면 됩니다. https://shwoghk14.blogspot.com/2020/06/android-recyclerview.html 이러한 DiffUtil.ItemCallback()을 사용했습니다. 이걸 DiffUtil.Callback()으로 변경할 겁니다. 여기서 47 번째 줄의 MultipleCounterRecyclerViewDiffCallback()을 지웁니다. ​ 그리고, 46 번째 줄의 ListAdapter를 RecyclerView.Adapter로 변경합

Android ConstraintLayout Barrier

이미지
사용 언어: Kotlin 1.8.10 사용 버전: Android Studio Flamingo 2022.2.1 Patch 1 ​ 안드로이드 ConstraintLayout Barrier를 알아보겠습니다. 배리어는 방어막, 보호막이라는 뜻을 가지는데요. 즉, 어떠한 뷰를 보호하는 가상의 결계를 생성합니다. 쳇, 결계인가... ​ ​ 말로 들으니 뭔지 모르겠네요. 코드를 봅시다. ​ 자, 이러한 layout이 있습니다. button이 현재는 가장 긴 글자인 Good에 맞춰져 있네요. 만약 클릭을 눌러서 100이 증가하여 10000으로 된다면? 아마도 10000이 Click 버튼과 겹쳐질 겁니다. 정말 골치 아픈 상황이군요. 한 번 보시죠. 으아 생각만 해도 아찔하군요. 이럴 때, Good과 100을 지키는 Barrier를 만듭니다. ​ 29 번째 줄처럼 Barrier를 만듭니다. 33 번째 줄 barrierDirection에는 방향을 정합니다. 저는 해당 뷰의 끝을 지키기 때문에 end를 적었습니다. 34 번째 줄처럼 constraint_referenced_ids에는 지킬 id들을 적습니다. 저는 위의 두 개의 TextView의 id를 적었습니다. 이제, Button으로 갑시다. 43 번째 줄처럼 app:layout_constraintStart_toEndOf에는 Barrier의 id를 적어줍니다. 미리 보기를 보면 이렇게 됩니다. 무슨 장막이 생겼네요. 실행해 봅시다. 짜잔. ​ ​ ​ Barrier에는 gone을 다루는 기능이 있습니다. barrierAl

Algorithm Find a prime

이미지
알고리듬 Find a prime을 알아보겠습니다. ​ 소수는 1과 자기 자신으로 만 나눠지는 수를 말합니다. 0과 1은 소수가 아닙니다. ​ 소수를 구할 때에는 약수의 성질을 이용합니다. 약수의 경우 대칭되는 값이 존재합니다. 따라서, 우리는 소수를 확인하기 위해 1에서 26까지 전부 확인할 필요 없이 1과 2만 확인하면 13, 26을 확인한 것과 똑같습니다. ​ 그렇다면, 이 절반을 어떻게 찾을 수 있을까요? 바로 제곱근(root)을 사용합니다. 약수가 저렇게 대칭되지만, 제곱근의 경우 대칭되는 수가 자기 자신이기 때문입니다. ​ 26의 경우 대략 5입니다. 따라서, 1~ 5까지만 확인하면 됩니다. ​ ​ ​ 코드로 한 번 봅시다. 1 보다 작으면 False 2와 3이면 True 그 외에는 12번째 줄처럼 math.sqrt를 이용해서 절반까지만 확인하면 됩니다. 끝. 카테고리: Algorithm

Android DataStore

이미지
사용 언어: Kotlin 1.8.10 사용 버전: Android Studio Flamingo 2022.2.1 ​ 안드로이드 DataStore을 알아보겠습니다. ​ 안드로이드에서 간단한 데이터를 저장하기 위해 SharedPreferences를 사용합니다. 하지만, Android Jetpack에서 DataStore를 만들면서 SharedPreferences 대신에 DataStore를 사용하기를 권장하고 있습니다. https://developer.android.com/topic/libraries/architecture/datastore DataStore에는 Preferences DataStore와 Proto DataStore가 있습니다. Preferences DataStore는 SharedPreferences와 같이 key, value 형식으로 불러오며, null을 다뤄야 합니다. Proto DataStore는 null이 없으며 사용자 정의 데이터 타입을 다룹니다. 그리고 protocol buffers라는 schema를 미리 만들어야 합니다. ​ 여기서는 Preferences DataStore만 다루겠습니다. ​ DataStore를 사용할 때 다음 사항을 따라야 합니다. 1. 하나 이상의 instance를 같은 프로세스 안에서 만들지 않습니다. 2. 타입을 변경하지 않습니다. 타입 변경이 필요한 경우 protocol buffers를 사용합니다. 3. SingleProcessDataStore와 MultiProcessDataStore를 섞어서 사용하지 않습니다. 여러 프로세스가 접근하려면 MultiProcessDataStore를 사용합니다. 앱 용 Gradle에 아래와 같이 정의합니다.

Algorithm Binary search and find boundary

이미지
알고리듬 Binary search and find boundary를 알아보겠습니다. ​ Binary search는 이진 탐색으로 찾는 시간이 O(log n)으로 빠릅니다. https://en.wikipedia.org/wiki/Binary_search_algorithm 이론은 다음과 같습니다. 2, 3, 5, 7, 11이라는 배열이 있습니다. 여기서 7을 찾아봅시다. ​ 가장 왼쪽을 left, 가장 오른쪽을 right로 두고, 그 가운데를 middle로 둡니다. 찾으려는 숫자(7)가 가운데(5)를 기준으로 오른쪽에 있으므로 왼쪽은 모두 제외합니다. middle이 있던 자리에 left로 만들고 또 가운데를 찾습니다. middle(7)과 찾으려는 숫자(7)이 같으므로 찾았습니다. 코드로 봅시다. 위의 방법 말고도 다른 방법이 있습니다. 위의 코드는 middle이 target과 같은지 항상 체크를 합니다. 아래의 코드는 항상 확인하지 않고 한 번 만 확인합니다. 찾으려는 값이 가장 왼쪽(leftmost)에 있는 값을 찾으려면 아래와 같이 사용합니다. 찾으려는 값이 가장 오른쪽(rightmost)에 있는 값을 찾으려면 아래와 같이 합니다.

Algorithm How many times make words

이미지
알고리듬 How many times make words를 알아보겠습니다. ​ 수많은 글자 중에서 해당하는 단어를 몇 번 만들 수 있는지 알아보는 알고리듬을 다뤄보겠습니다. ​ jaehwa를 만들어 본다고 가정하고 진행합니다. 해당 글자는 다음과 같은 철자로 구성되어 있습니다. j 1 개, a 2 개, e 1 개, h 1 개, w 1 개입니다. 위의 글자 구성이 전부 있어야 하는데요. 글자 중 하나라도 없다면 해당 글자를 만들 수 없습니다. 즉, j가 99 개 있어도, 1 개밖에 못 만듭니다. 위의 단어를 구성하는 글자 중에서 가장 작은 숫자에 맞춰지게 됩니다. ​ Python으로 한 번 볼게요. ​ 아래의 글자 속에서 jaehwa를 몇 번 만들 수 있을까요? asdlkfjewoiurpewt]fivzj,./vncbhildfq[reiptojdklajfklc.sdafruweqporp[tu 먼저, dictionary를 만들어줍니다. 여기에는 미리 jaehwa를 넣어줍니다. 왜냐하면, 파이썬은 초깃값이 없을 때 뭔가 연산을 하면 오류가 나기 때문이죠. 그다음, 12 번째 줄에서 text를 한 글자씩 보면서 my_dict에 넣습니다. 결과는 다음과 같네요. h가 하나뿐이라서 안 봐도 1 개 밖에 못하겠군요. 이것을 코딩으로 계산하려