전체 글

· Algorithm
문제널리 잘 알려진 자료구조 중 최대 힙이 있다. 최대 힙을 이용하여 다음과 같은 연산을 지원하는 프로그램을 작성하시오.배열에 자연수 x를 넣는다.배열에서 가장 큰 값을 출력하고, 그 값을 배열에서 제거한다.프로그램은 처음에 비어있는 배열에서 시작하게 된다.입력첫째 줄에 연산의 개수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 자연수라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0이라면 배열에서 가장 큰 값을 출력하고 그 값을 배열에서 제거하는 경우이다. 입력되는 자연수는 231보다 작다.출력입력에서 0이 주어진 횟수만큼 답을 출력한다. 만약 배열이 비어 있는 경우인데 가장 큰 값을 출력하라고 한 경우에는 0을 ..
프래그먼트를 포커싱 하면 구성한 로직에 따라 비동기적으로 데이터를 호출하고 결과가 오면 해당 프래그먼트의 View를 업데이트하는 로직이 있는데, API 호출하여 데이터 수신된 이후에 해당 View가 더 이상 유효하지 않아서 발생하는 문제로 보입니다.따라서 아래와 같이 코드를 처리했습니다.GetInfoApiTask().executeAsync({ result -> val isValidViewStatus = isAdded && !isDetached && context != null if (!isValidViewStatus) return@executeAsync세 가지 조건을 체크해줬습니다./** * Return true if the fragment is currently added to its act..
· Algorithm
투 포인터(Two Pointers) 알고리즘은 정렬된 배열에서 효율적으로 특정 조건을 만족하는 값을 찾거나, 구간을 탐색하기 위해 사용되는 알고리즘입니다. 두 개의 포인터를 배열의 양 끝에 배치하거나 특정 위치에서 시작해, 이를 이동시키며 조건을 만족하는 값을 찾습니다. 정렬된 배열에서 가장 많이 사용됩니다.두 포인터를 사용하여 한 번의 탐색으로 문제를 해결하므로 시간 복잡도는 보통 O(N)입니다.이분 탐색처럼 중간 값을 탐색하지 않고, 포인터를 이동시켜 범위를 좁혀 나가는 방식입니다.투 포인터의 동작 원리배열의 양 끝에서 시작하거나, 시작 지점을 설정합니다.각 포인터의 값에 따라 조건을 확인합니다.조건에 따라 왼쪽 포인터를 오른쪽으로 이동하거나 오른쪽 포인터를 왼쪽으로 이동합니다.두 포인터가 교차하거나..
· Algorithm
배열의 중간 요소를 반복적으로 확인하며 탐색 범위를 절반으로 줄여나갑니다. 시간 복잡도는 아래와 같습니다.작동 원리정렬된 데이터: 이분 탐색은 반드시 정렬된 데이터에서만 동작합니다.중간 값 선택: 배열의 중간 값을 선택합니다.조건 비교:찾는 값이 중간 값보다 작으면 왼쪽 절반을 탐색합니다.찾는 값이 중간 값보다 크면 오른쪽 절반을 탐색합니다.찾는 값이 중간 값과 같으면 탐색을 종료합니다.반복: 값을 찾거나 범위가 비워질 때까지 반복합니다.fun binarySearch(array: IntArray, target: Int): Int { var low = 0 var high = array.size - 1 while (low return mid // 값을 찾은 경우 arra..
Expandable menu위처럼 클릭할 때마다 열렸다 닫혔다를 반복하는 메뉴 레이아웃 구성 방법입니다.Compose의 AnimatedVisibility를 활용하여 간단하게 Expand 효과를 적용할 수 있습니다.기본 작동 방식visible: Boolean 값을 통해 콘텐츠의 표시 여부를 결정합니다.애니메이션 효과: 요소가 보이거나 사라질 때 애니메이션 효과를 자동으로 적용합니다.@Composablefun ColumnScope.AnimatedVisibility( visible: Boolean, modifier: Modifier = Modifier, enter: EnterTransition = fadeIn() + expandVertically(), exit: ExitTransition..
· Coding Test
https://www.acmicpc.net/problem/12865문제이 문제는 아주 평범한 배낭에 관한 문제이다.한 달 후면 국가의 부름을 받게 되는 준서는 여행을 가려고 한다. 세상과의 단절을 슬퍼하며 최대한 즐기기 위한 여행이기 때문에, 가지고 다닐 배낭 또한 최대한 가치 있게 싸려고 한다.준서가 여행에 필요하다고 생각하는 N개의 물건이 있다. 각 물건은 무게 W와 가치 V를 가지는데, 해당 물건을 배낭에 넣어서 가면 준서가 V만큼 즐길 수 있다. 아직 행군을 해본 적이 없는 준서는 최대 K만큼의 무게만을 넣을 수 있는 배낭만 들고 다닐 수 있다. 준서가 최대한 즐거운 여행을 하기 위해 배낭에 넣을 수 있는 물건들의 가치의 최댓값을 알려주자.입력첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가..
· Coding Test
문제절댓값 힙은 다음과 같은 연산을 지원하는 자료구조이다.배열에 정수 x (x ≠ 0)를 넣는다.배열에서 절댓값이 가장 작은 값을 출력하고, 그 값을 배열에서 제거한다. 절댓값이 가장 작은 값이 여러개일 때는, 가장 작은 수를 출력하고, 그 값을 배열에서 제거한다.프로그램은 처음에 비어있는 배열에서 시작하게 된다.입력첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 0이 아니라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0이라면 배열에서 절댓값이 가장 작은 값을 출력하고 그 값을 배열에서 제거하는 경우이다. 입력되는 정수는 -231보다 크고, 231보다 작다.출력입력에서 0이 주어진 횟수만큼 답을 출력..
Intent로 화면을 전환할 때, 간혹 기획에 따라 전환 애니메이션이 필요한 경우가 존재합니다.이럴 때에는 anim 리소스를 정의하고, overridePendingTransition() 메서드를 활용해 주면 됩니다.오른쪽에서 나타나 왼쪽으로 사라지는 애니메이션 리소스 파일입니다.  실제 Intent 호출 시에는 아래처럼 정의해줍니다.startActivity(Intent(activity, StoreItemListActivity::class.java))activity?.overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left) 하지만 API 34부터는 해당 메서드가 deprecated 되어서 overrideActivityTra..
APK를 빌드하고 나서 Analyze APK를 클릭하면 위처럼 dex 파일과 디렉터리로 구성된 빌드 결과물을 확인할 수 있습니다.그런데, 프로가드 적용 유무에 따라 이 분석 결과가 달라집니다. 무슨 연관이 있을까요?DEX (Dalvik Executable) 파일이란?DEX 파일은 안드로이드 애플리케이션의 바이트코드를 담고 있는 파일입니다.안드로이드는 Dalvik/ART(안드로이드 런타임)를 사용해 DEX 파일을 실행합니다.모든 자바 클래스 파일(.class)들은 하나 이상의 DEX 파일로 변환되어 안드로이드 패키지(APK)에 포함됩니다.DEX 파일은 메모리와 성능 최적화를 위해 설계되었으며, 앱의 크기와 성능에 중요한 영향을 미칩니다.DEX와 ProGuard의 연관성- ProGuard가 DEX 파일 생성..
MVI 패턴이란?Model - View - Intent의 약자로, 단방향 데이터 흐름을 가지는 패턴입니다.State를 중심으로 UI에 전달하는 방식으로서 여기서 Intent는 기존에 알고 있는 Intent와는 다른 개념입니다. Model: 상태(State)로, UI에서 보일 데이터 또는 상태입니다.View: 화면(UI)을 구성하는 요소로, Model의 상태 변화를 관찰하여 이를 반영합니다.Intent: 사용자의 액션이나 이벤트를 정의한 것으로, 이를 통해 Model이 업데이트됩니다. 상태가 중심인 MVI에서는 데이터는 불변의 구조로 구성되며, 그로 인해 상태가 변할 때 필요한 부분만 갱신되면서 효율성이 증가합니다. MVI 패턴 장점1. 단방향 데이터 흐름 (Unidirectional Data Flow)상..
SeungYong.Lee
Win-Dev