전체 글 55

Kotlin의 ArrayDequeue : Stack & Queue를 손쉽게 사용하기

public class ArrayDeque : AbstractMutableList Deque는 Double Ended Queue의 줄임말이다. 덱이라고 부르면 된다. 어느 방향으로든 삽입과 삭제가 구현되어있어서 Stack으로도, Queue로도 사용 가능하다. MutableList로 구현되어있어서 index를 통한 get/set operation도 가능하다. Stack으로 사용하는 법 /* Stack */ val stack = ArrayDeque() stack.add(e) // push, list 끝에 넣는다. stack.removeLast() // pop stack.last() // peek(조회) : Java에 Vector로 구현된 Stack이 있어서 Stack은 꼭 Deque을 사용하지 않아도 된다...

삽입정렬(Insertion Sort)

문은영 교수님의 데이터구조 수업 자료입니다. 문제시 삭제하겠습니다. 방식 i가 0 ~ n-1 일 때, 왼쪽 카드가 지금 카드보다 크다면 교환한다. 그렇지 않다면 다음 iteration으로 넘어간다. 이 작업을 index i부터 1까지 매 iteration에서 반복한다. 일부 항목만 정렬이 흐트러졌을 때 사용하면 유리한데, 1. 배열이 이미 정렬되었을 경우 linear time으로 동작하고 2. 구현이 쉽기 때문이다. 시간복잡도 Avg - O(n^2) iteration i에서 벌어지는 swap과 비교 횟수의 평균은 각각 i/2회이다. 시간복잡도를 big-O natation으로 표현하면 O(T(n)) = O(n(n-1)/4) = O(n^2) 이다. Best - O(n) 배열이 이미 정렬되었을 때 각 iter..

선택정렬(Selection Sort)

문은영 교수님의 데이터구조 수업 자료입니다. 문제시 삭제하겠습니다. 방식 i번째(0부터 시작) iteration에서 0 ~ i-1 까지는 정렬되어있음이 보장된다. 이때 i ~ n 까지의 entry 중에 가장 작은 값을 a[i]와 교환한다. 구현할 때 entry 범위가 헷갈릴 수 있다. arr[0]에 가장 작은 값이 들어가는 것이 보장되어야함을 기억하면 덜 헷갈린다. 시간 복잡도 Avg - O(n^2) ith iteration에서 n-i 개의 entry 중 가장 작은 값을 찾는데에는 평균 (n-i)/2 의 비용이 든다. i가 1부터 n까지 이므로 평균 시간복잡도는 T(n) = (탐색) + (교환) = ( 0+…+n-1 ) / 2 + ( 1 * n )이고 O(T(n)) = O(n^2) 이다. Best - O..

CoordinatorLayout에서 겹쳐진 뷰의 터치 이벤트를 처리하는 방식

BottomSheet를 구현하는 도중, BottomSheet 뒤에 가려진 버튼들이 클릭이 가능해지는 버그가 있었다. 스택 오버플로우의 글을 읽고 바텀시트에 clickable="true"를 추가해서 간단히 해결했지만, CoordinatorLayout에서 터치를 가로채는 방식에 대해서 정리해야겠다는 생각이 들었다. coordinatorLayout에서 상위 뷰가 하위 뷰의 터치를 가로채는 동작은 아래에 보이는 CoordinatorLayout.Behavior 를 상속받아서 구현한다. public class CoordinatorLayout extends ViewGroup implements NestedScrollingParent2, NestedScrollingParent3 { ... public static ab..

Jetpack Navigation Safeargs 사용법

navigation에서 argument는 프래그먼트에게 속성을 붙여주는 것과 비슷하다. fragment별로 앱바 종류를 argument에 저장해서 다른 앱바를 적용하게 할 수도 있고(Android10B MainActivity 참고) 다른 프래그먼트로부터 받을 데이터가 있으면 그걸 argument로 저장해서 받을 자리를 만들 수도 있다.(argument가 마치 우유 바구니같은 역할을 하는 것) 그러나 safe args를 통해 전달하는 데이터는 가능한 작은 값이어야한다. ex) 어떤 object를 줘야할 때, 오브젝트 대신 그 오브젝트를 찾을 수 있는 key 값이나 인덱스를 준다. 만약 대량의 데이터를 공유하는 화면인 경우 같은 뷰모델을 사용하는 것을 고려하자. 우리가 하는 디테일 정보 표시같은 경우 작은 ..

Kotlin의 시간계산 : LocalDate, LocalDateTime, Duration

LocalDate : 특정 지역의 연, 월, 일을 저장하기 위한 클래스. 계산도 가능하다. 일 단위 이하 연산이 불가능하다. LocalDateTime : 특정 지역의 연, 월, 일, 시, 분, 초, 밀리초를 저장하기 위한 클래스. LocalDate로 전환할 수 있다. 문자열을 바꿀때는 DateTimeFormatter를 사용할 수 있다. private val DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy:MM:dd:HH:mm:ss") val text = "2022:11:27:13:50:00" LocalDateTime.parse(text, DATE_FORMATTER) 만약 text가 ISO 공식 포맷을 따르는 경우 DateTimeFormatter의 프로퍼티를 그대..

List를 Map으로 만들기: associate

Kotlin의 associate 메서드를 사용한다. 일단 사용 예시부터 보자. val list = listOf(1, 2, 3) val exp1 = list.associateWith { "value" } // [1:value, 2:value, 3:value] val exp2 = list.associateBy { "key" } // [key: 1, key: 2. key: 3] -> [key: 3] 이 됨 val exp3 = list.associateBy { it } // [1: 1, 2: 2, 3: 3] val exp4 = list.associateBy({ it }, { "숫자$it" }) // [1: 숫자1, 2: 숫자2, 3: 숫자3] 1. associateWith ( valueSelector ) key..

java.io.File 사용법

[공식문서] 소개 요약 File is An abstract representation of file and directory pathnames. Instances of the File class are immutable Unix/Window 스타일, 절대/상대 경로 모두 지원함 getParent( )로 최상단 디렉토리를 얻을 수 있음. getPath( )로 pwd를 대체할 수 있음. Constructor 종류는 아래와 같다. File(File parent, String child) // Creates a new File instance from a parent abstract pathname and a child pathname string. File(String pathname) // Creates a..