[Android/Compose] TextUnit 과 Dp
·
Android/Compose
개요컴포즈의 Text 컴포넌트에서 폰트 크기는 아래와 같이 설정할 수 있습니다. Text( text = "Android", fontSize = 16.sp) 만약 폰트 크기의 단위를 Dp 로 설정한다면 어떻게 될까요?XML 에서라면 정상적으로 사용이 가능했지만 컴포즈에서는 컴파일 오류가 발생하게 됩니다..sp 의 경우, TextUnit 을 반환하지만 .dp 는 Dp 를 반환하기 때문입니다. @Stableval Int.sp: TextUnit get() = pack(UNIT_TYPE_SP, this.toFloat())@Stableinline val Int.dp: Dp get() = Dp(this.toFloat()) 물론 앱 접근성을 확장하기 위해 시스템 폰트 설정에 따라 동적으로 크기가 변하는 Sp..
[Kotlin] inline 함수와 reified
·
Kotlin
inline 함수 인라인 (inline) 키워드는 자바에서는 제공하지않는 코틀린 전용 키워드입니다. 코틀린을 이용하여 개발하다보면, 함수의 파라미터로 고차함수를 넘겨 사용하는 경우가 많습니다. 하지만 코틀린 공식문서에서는 고차함수를 사용하면 메모리 할당 및 가상 호출을 통해 런타임 오버헤드를 발생시켜 특정 런타임 패널티가 부과된다고 소개하고 있습니다. 인라인 함수를 이용하면, 내부적으로 함수의 내용을 함수가 호출되는 위치에 복사하여 런타임 오버헤드를 줄일 수 있습니다. 그렇다면 내부적으로 함수의 내용을 호출하는 위치에 복사한다는 것은 어떤 의미일까요? 아래와 같이 고차함수를 파라미터로 받는 함수가 있습니다. fun executeJob(job: () -> Unit) { println("execute new..
[안드로이드 / Kotlin] FusedLocationProviderClient
·
Android
안드로이드에서는 기본적으로 LocationManager 를 이용하여 위치 정보를 가져올 수 있습니다. LocationManager 는 Context.getSystemService() 메소드를 이용하여 구현할 수 있고, GPS, Wi-Fi, Network 를 통해 직접 요청할 수 있습니다. 하지만 개발자가 상황에 맞게 직접 구현해야 하므로 비교적 구현이 복잡할 수 있습니다. Google Play 서비스에서 제공하는 Location API 를 이용하면, 위의 방법들을 알아서 융합적으로 고려하여 요청하기 때문에 기기의 배터리 사용을 최적화할 수 있습니다. FusedLocationProviderClient 는 해당 API 에서 사용되는 객체이며, 지금부터 이에 대한 간단한 사용법에 대해 알아보겠습니다. 의존성 ..
[백준 / Java] 17070번 파이프 옮기기 1
·
알고리즘/백준
https://www.acmicpc.net/problem/17070 17070번: 파이프 옮기기 1 유현이가 새 집으로 이사했다. 새 집의 크기는 N×N의 격자판으로 나타낼 수 있고, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 (r, c)로 나타낼 수 있다. 여기서 r은 행의 번호, c는 열의 www.acmicpc.net 문제 유형 다이나믹 프로그래밍 DFS 문제 풀이 이 문제는 DFS(깊이 우선 탐색) 과 다이나믹 프로그래밍 으로 각각 해결할 수 있다. DFS DFS 를 이용한 풀이 방법은 매우 간단하다. 별도의 방문처리 배열을 사용하지 않고, 조건에 맞게 재귀를 수행하면 된다. 이런 점에서 재귀를 이용한 구현 문제에 더 가깝다고 할 수도 있다. 소스 코드 import java.util...
[프로그래머스 / Java] N으로 표현
·
알고리즘/프로그래머스
https://school.programmers.co.kr/learn/courses/30/lessons/42895 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 유형 다이나믹 프로그래밍 문제 풀이 이 문제는 동적계획법, 즉 다이나믹 프로그래밍 을 이용하여 해결할 수 있다. 처음에는 문제에서 주어진 number 와 관련된 점화식을 세워 접근하려 했으나 쉽지 않았다. 그래서 N 의 사용횟수에 따라 가능한 값을 구하는 방식을 사용했다. 이해를 돕기위해 한가지 예를 들어보자. N 이 5일 때, N 의 사용횟수에 따라 가능한 값들은 아래와 같다. N의 사용횟..
[프로그래머스 / Java] 조이스틱
·
알고리즘/프로그래머스
https://school.programmers.co.kr/learn/courses/30/lessons/42860 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 유형 그리디 문제 풀이 이 문제는 항상 최선의 경우를 선택하는 그리디 알고리즘을 이용하여 해결할 수 있다. 문제를 해결하기 위해, 조이스틱을 상하로 움직이는 부분과 좌우로 움직이는 부분으로 나눠 구현해야 한다. 상하로 움직이는 부분의 경우 쉽게 구현할 수 있다. name 을 알파벳 별로 차례로 탐색하면서 조작 횟수가 더 작은 방법을 선택하면 된다. 만약 알파벳 Z를 만든다면, A부터 Z까지 ..
[백준 / Java] 2098번 외판원 순회
·
알고리즘/백준
https://www.acmicpc.net/problem/2098 2098번: 외판원 순회 첫째 줄에 도시의 수 N이 주어진다. (2 ≤ N ≤ 16) 다음 N개의 줄에는 비용 행렬이 주어진다. 각 행렬의 성분은 1,000,000 이하의 양의 정수이며, 갈 수 없는 경우는 0이 주어진다. W[i][j]는 도시 i에서 j www.acmicpc.net 문제 유형 다이나믹 프로그래밍 비트마스킹 문제 풀이 이 문제를 완전 탐색으로 접근한다면, 시간초과 판정을 받게 된다. 왜냐하면 모든 도시를 탐색하는데 드는 비용은 순열의 비용과 동일하기 때문에 (N-1)! 의 시간복잡도를 가진다. 다이나믹 프로그래밍을 이용하면 반복되는 부분을 제거하여 시간복잡도를 줄일 수 있는데, 이해를 돕기 위해 한 가지 예를 살펴보자. N..
[안드로이드 / Kotlin] Coroutine Flow debounce를 이용한 검색 구현
·
Android
안드로이드 앱을 개발하다보면 EditText를 이용한 검색 기능을 많이 구현합니다. 하지만 EditText에서 입력값의 변화를 감지할 때마다 API 호출을 하게되면 많은 비용을 소비하게 됩니다. 예를 들어 빠르게 값을 입력하고 지웠다면, 불필요한 입력에도 API를 호출하여 매우 비효율적이라 할 수 있습니다. 그러므로 일정 시간 간격을 주고, 유저의 입력이 끝났다고 판단될 때 API 호출하여 좀 더 효율적으로 구현해야 합니다. 이때 사용하는 것이 debounce 기법입니다. debounce란? debounce는 스크롤 또는 값의 입력과 같이 이벤트가 과도하게 많은 API를 호출할 경우 지정한 시간 동안 호출의 제약을 걸어 과부하를 방지하는 기술입니다. 예를 들어 지정한 시간을 1초라고 할 때, 이 1초 동..
[알고리즘 / Java] 벨만 포드 알고리즘
·
알고리즘/개념
안녕하세요! 최단 경로 알고리즘으로 다익스트라 알고리즘과 플로이드 워셜알고리즘이 많이 알려져 있습니다. 오늘은 또다른 최단 경로 알고리즘인 벨만 포드 알고리즘을 소개시켜 드리고자 이번 포스팅을 하게되었습니다. 벨만 포드 알고리즘을 소개하기 이전에, 다익스트라 알고리즘 및 플로이드 워셜 알고리즘의 한계점을 먼저 알고가면, 벨만 포드 알고리즘을 이해하는데 큰 도움이 되기 때문에 이 부분부터 먼저 살펴보도록 하겠습니다! 다익스트라 알고리즘의 한계 이번 포스팅에서는 다익스트라 및 플로이드 워셜 알고리즘에 대한 설명을 따로 하지 않고, 다음에 기회가 되면 이 두가지 알고리즘에 대해 따로 포스팅하도록 하겠습니다. 다익스트라 알고리즘은 그리디(Greedy) 알고리즘을 기반으로 구현합니다. 시작점을 기준으로 연결된 노..
[백준 / Java] 2467번 용액
·
알고리즘/백준
https://www.acmicpc.net/problem/2467 2467번: 용액 첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 오름차순으로 입력되며, 이 수들은 모두 - www.acmicpc.net 문제 유형 투 포인터 이진 탐색 문제 풀이 전체 용액의 수 N의 범위가 2 이상 100,000 이하의 정수이므로, 완전 탐색을 이용해서 풀 수 없다. 따라서 O(NlogN) 의 시간복잡도 문제를 해결해야 하는데, 다행스럽게도 입력 데이터가 이미 오름차순 정렬되어 있다! 이를 이용하여 문제를 해결하기 위한 가장 직관적인 방법은 투 포인터이며, 이외에도 이진 탐색을 이용해서 풀 수 있다. 투 포..