목록분류 전체보기 (140)
시배's Android
진정한 의미에서 추상화란 현실에서 출발하되 불필요한 부분을 도려내가면서 사물의 놀라운 본질을 드러나게 하는 과정이라고 할 수 있다. 추상화의 목적은 불필요한 부분을 무시함으로써 현실에 존재하는 복잡성을 극복하는 것이다. 추상화는 복잡한 현실을 단순화하기 위해 사용하는 인간의 가장 기본적인 인지 수단이라고 할 수 있다. 어떤 양상, 세부 사항, 구조를 좀 더 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 생략하거나 감춤으로써 복잡도를 극복하는 방법이다. 공통점을 기반으로 객체들을 묶기 위한 그릇을 개념이라고 한다. 개념을 이용하면 객체를 여러 그룹으로 분류할 수 있다. 객체란 특정한 개념을 적용할 수 있는 구체적인 사물을 의미한다. 개념이 객체에 적용됐을 때 객체를 개념의 인스턴스라고 한다. 심볼 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bKUFFM/btsxrlkAe4u/7rKvXgF8SztETpqcN1Jpuk/img.png)
현재 TiTi에서는 Task를 선택하기 위해 BottomSheet에서 Task를 선택, 수정, 추가, 삭제 등 다양한 작업을 할 수 있는 화면이 있습니다. 이 화면에 요구사항으로는 다음과 같습니다. Edit 모드에 진입하면 좌우측에서 삭제와 드래그할 수 있는 아이콘이 Animate 하게 등장한다. SwipeDismiss를 통해 삭제가 가능하다. LongClick을 통해 Task명을 수정하는 Dialog가 등장한다. 이러한 요구사항을 만족하기 위해 아래와 같은 Compose의 API를 이용하여 쉽게 구현할 수 있습니다. AnimateVisibility SwipeToDismiss combinedClickable AnimateVisiblity AnimatedVisibility(visible = editMode..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/74HbQ/btsxUa2KPB6/R03cMymfylGsnqCyeMKGoK/img.png)
TdsDialogInfo 일반적으로 Dialog에는 Alert Dialog와 Confirm Dialog가 있습니다. Alert Dialog는 사용자에게 특정 메시지를 전달해주는 경우, Confirm Dialog는 사용자에게 특정 메시지 전달과 동시에 해당 메시지에 응답할 것인지 여부를 확인하는 Dialog로 볼 수 있습니다. sealed interface TdsDialogInfo { val title: String val message: String val cancelable: Boolean val onDismiss: (() -> Unit)? data class Confirm( override val title: String, override val message: String, override val ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/byDtgy/btsxkCgmvzP/iAajpe8ycdmAwi8DSOpNeK/img.png)
반응형 Timer와 StopWatch 구현하기 TiTi 프로젝트에서는 Timer와 StopWatch를 구현해야 했으며, 기기의 가로 세로 방향에 상관 없이 반응형으로 동작해야 하는 요구사항이 있었습니다. 더불어, 화면 크기의 약 80% 정도를 차지하도록 구현해야 했습니다. 이를 위해 Compose의 BoxWithConstraints를 활용한 방법을 소개합니다. BoxWithConstraints(modifier = modifier) { val minSize = min(maxHeight, maxWidth) val outCircularSize = minSize * 0.8 val outCircularTrackWidth = minSize * 0.05 val inCircularSize = outCircularSiz..
1206번: 사람의 수 첫째 줄에 N이 주어진다. 둘째 줄부터 N개의 줄에 각 문항의 평균 점수가 주어진다. N은 50보다 작거나 같은 자연수이고, 평균 점수는 0보다 크거나 같고, 10보다 작거나 같은 소수이다. 항상 소수 www.acmicpc.net import java.util.* private val visited = Array(1001) { false } private val edges = Array(1001) { mutableListOf() } private fun dfs(v: Int) { if (visited[v]) return visited[v] = true print("$v ") edges[v].forEach { dfs(it) } } private fun bfs(v: Int) { val ..
7576번: 토마토 첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토 www.acmicpc.net import java.util.* private fun main() { val r = System.`in`.bufferedReader() val queue: Queue = LinkedList() val (n, m) = r.readLine().split(' ').map { it.toInt() } val arr = Array(m) { IntArray(n) } for (y in 0 until m) with(StringTokenizer(r.readLin..
2606번: 바이러스 첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하인 양의 정수이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍 www.acmicpc.net import java.util.* private fun main() { val a = readLine()!!.toInt() val b = readLine()!!.toInt() val map = Array(a + 1) { IntArray(a + 1) { 0 } } val visited = BooleanArray(a + 1) var ans = 0 repeat(b) { val (c, d) = readLine()!!.split(" ").map { it.toInt() } ma..
12101번: 1, 2, 3 더하기 2 n을 1, 2, 3의 합으로 나타내는 방법 중에서 사전 순으로 k번째에 오는 것을 출력한다. k번째 오는 식이 없는 경우에는 -1을 출력한다. www.acmicpc.net private fun main() { val (N, K) = readLine()!!.split(" ").map { it.toInt() } val res = ArrayList() fun go(now: Int, str: String) { if (now == N) { res.add(str) return } if (now > N) { return } for (i in 1..3) { go(now + i, "$str+$i") } } for (i in 1..3) { go(i, "$i") } println(if..