전체 글
[Kotlin] 정렬 2 (병합정렬, 퀵정렬)
1. 병합정렬 (Merge Sort) 배열을 균등한 크기의 두 배열로 나누어 분할된 각 배열을 정렬한 다음 합하여 정렬하는 형태이다. 재귀함수와 분할정복을 사용하여 구현한다. 정렬은 항상 느끼지만 글로 설명하는 것 보단 아래 애니메이션을 통해 직접 동작을 확인하는 것이 이해가 빠른 것 같다. 병합정렬 Kotlin Code // mergedList = split(arr) fun split(arr: ArrayList): ArrayList { if (arr.size
[Kotlin] 동적 계획법 (Dynamic Programming, DP) (+ 분할 정복과의 차이)
1. 동적 계획법(Dynamic Programming, DP) 주어진 문제를 작은 문제로 나누어 푸는 알고리즘. 작은 문제를 해결한 후, 해결한 작은 문제의 해답을 활용하여 주어진 문제를 해결하는 방식을 말한다. 피보나치 수열을 해결 할 때 f(n) = f(n-1) + f(n-2) 와 같은 점화식을 가지게 되는데, 이는 f(n)을 구하기 위한 하위 문제들 (f(n-1), f(n-2)..) 의 해가 중복된다. f(6)을 구하기 위해 하위 문제들의 해를 중복으로 구하게 됨으로써, 비효율적인 시간 복잡도를 가지게 된다. 이렇게 답을 구하기 위해 했던 계산을 반복해야 하는 문제에서 하위 문제의 해를 재사용해 문제를 해결하는 DP가 효율적으로 동작한다. 2. 동적 계획법의 조건 최적 부분 구조(Optimal Su..
[Kotlin] 정렬 1 (버블정렬, 선택정렬, 삽입정렬)
1. 버블정렬 (Bubble Sort) 인접한 두 값을 비교하여 뒤의 값이 더 작을 시 swap을 수행하는 정렬이다. 배열을 한 번 순회 할 때마다 배열의 맨 뒤 index부터 가장 큰 값이 정렬된다. 버블정렬 Kotlin Code // 바깥쪽 loop(배열을 순회할 횟수) for (i in 0 until n - 1) { var isSwap = false // 안쪽 loop(swap 여부를 판단할 횟수) // 바깥쪽 loop가 한 번 돌 때마다 배열의 끝에 정렬된 값이 들어오므로 n - 1 - i for (j in 0 until n - 1 - i) { if (array[j] > array[j + 1]) { swap(array, j, j + 1) isSwap = true } } // 정렬이 완료된 경우 바..
[Kotlin] 자료구조 2 (해쉬 , 트리, 힙)
1. 해쉬 (Hash) 해쉬 함수 (Hash function) : 임의의 데이터를 고정된 길이의 데이터로 매핑시키는 함수. 해쉬 (Hash) : 해쉬 함수를 통해 매핑된 고정된 길이의 데이터 해쉬의 특징은 다음과 같다. 1. 결과값이 중복될 가능성의 거의 없다. 2. 입력값을 알 수 없으며, 결과값을 알아도 이를 통해 입력값을 유추할 수 없다. 해쉬 테이블 (Hash table) : 해쉬값을 index로 사용하여 key, value 형태로 값을 저장하는 자료구조. 해쉬 충돌 (Hash Collision) : 고정된 길이의 데이터로 변환하는 해쉬의 한계로 인해, 서로 다른 두 개의 key가 동일한 hash 값을 갖게 되는 것. 이러한 해쉬 충돌을 해결하기 위한 방법으로는 두 가지가 존재한다. 1. Chai..
[Kotlin] 자료구조 1 (배열, 스택, 큐, 링크드리스트)
1. 배열 (Array) 같은 type의 연관된 데이터를 효율적으로 관리하기 위한 자료구조. 장점 : index를 통해 원하는 위치에 있는 값에 대해 효율적으로 접근 할 수 있음. 단점 : 크기가 정해져 있으므로 유동적인 데이터의 추가, 삭제가 어려움. 시간 복잡도 : 접근 - O(1) [Index를 통해 값에 바로 접근] 검색 - O(n) [처음 Index부터 순회] 추가, 삭제 - 맨 뒤에 추가, 삭제 시 O(1), 중간 값일 시 추가, 삭제 후 데이터를 한칸씩 밀어야 하므로 O(n) 코틀린에서의 Array는 다음과 같이 사용할 수 있다. // 크기 3의 배열 [1, 2, 3] val array: Array = arrayOf(1, 2, 3) // 크기 5의 배열 [0, 0, 0, 0, 0] val a..
[Android, Kotlin] ClipboardManager를 사용하여 기기에서 복사된 값 붙여넣기
문제 : 택배 조회를 위해 운송장 번호를 입력해야 한다. 이 때, 휴대폰에서 복사한 운송장 번호를 자동으로 붙여넣기 할 수 있는 기능을 추가해야 한다. (Dialog를 통해 붙여넣기 여부 확인) 해결 : 휴대폰에서 복사한 값에 대한 처리는 클립보드(clipboard)에서 담당한다. 클립보드(clipboard) : '종이 끼우개' 라는 뜻으로, 잘라내기(복사) / 붙여넣기를 통해 문서 또는 응용프로그램 사이에서 자료가 전송 될 때 짧은 시간동안 해당 값을 저장하는 데에 사용되는 소프트웨어 프로그램 우리는 이 클립보드에서 사용자가 복사 (또는 잘라내기) 한 값을 꺼내서 해당 값의 유효성을 확인 한 후, 붙여넣을지 여부를 확인 할 것이다. Android, Kotlin에서는 클립보드의 값을 꺼내오기 위해 Cli..
[Android, Kotlin] sortedWith()와 compareBy()를 사용한 collection의 다중 정렬 기준 설정
문제 : 등록한 운송장 리스트의 배송 상태가 업데이트 될 때, 업데이트 된 배송 상태에 따라 리스트의 정렬이 필요했다. 다음과 같은 형태의 데이터를 가지는 TrackingInfoCompany 객체의 List를 정렬해야 한다. data class TrackingInfoCompany { val completeYN: String, // 배송완료 시 "Y", 아니면 "N" val time: Long // 마지막 업데이트 시간 (millisecond 단위) } 정렬 기준은 다음과 같다. 1. 배송 완료의 경우, 업데이트 시간에 관계 없이 가장 인덱스의 뒤에 위치. (배송 완료 상태의 값끼리는 업데이트 시간 최근 순으로 인덱스 앞 위치) 2. 업데이트 시간이 최근 순으로 인덱스의 앞에 위치. 해결 : 이를 해결하기..
[Android, Kotlin] RecyclerView에서 스크롤 시 Check box의 check 상태 보존
배경 : "편집" 버튼 클릭 시, RecyclerView의 각 Item 왼쪽에 선택 할 수 있는 체크 박스가 나온다. 문제 : 체크 후, RecyclerView 스크롤 시 체크의 상태가 보존되어 있지 않는다. 기존 코드 : // ViewHolder의 bind 메소드 fun bind(info: TrackingInfoCompany) { val position = bindingAdapterPosition.takeIf { it != NO_POSITION } ?: return binding.information = info binding.checkBox.isVisible = modifyMode binding.checkBox.isChecked = getItem(position).isChecked binding.ch..
[Android, Kotlin] Bottom Navigation View + Jetpack Navigation 사용 시 fade animation 제거
Bottom Navigation View와 Jetpack Navigation을 함께 연결하여 사용하게 되면, 자동적으로 탭 간 전환에서 fade animation이 적용된다. fade amination도 괜찮지만 UX 측면에서 탭 간 전환에 답답함을 느낄 수도 있을 것 같아 이를 제거하고자 하였다. 기본으로 지정되어 있는 애니메이션을 수정하기 위해 아래 경로에 해당 코드를 넣어 애니메이션을 제거한다. 주의 할 점은, 일반적으로 사용하는 anim이 아닌, animator 디렉토리에 저장해야한다. res/animator/nav_default_enter_anim.xml res/animator/nav_default_exit_anim.xml res/animator/nav_default_pop_enter_anim...
[Android, Kotlin] Custom Dialog 만들기
만들게 된 이유 : 앱 기능 중 Shared Preference를 이용하여 초기 프로필 이름 설정이 존재. 해당 Dialog를 커스텀하게 만들기 위해. 결과물 : rounded corner + 커스텀 레이아웃으로 다이얼로그를 꾸몄다. 코드 : // dialog_radius_background.xml dialog의 corner radius를 위한 background xml을 구성한다. : 사각형 shape : corner radius(둥글기) 30dp 지정 : background color white // dialog_edittext_background.xml dialog에 들어가는 EditText의 background xml을 구성한다. : 두께 2dp의 테두리 선 , 색상 black // dialog_..