본문 바로가기

전체 글282

[Android, Kotlin] 모든 파일에 대한 접근 권한 부여 방법(모든 Android 버전 대응) 모든 파일 접근 권한 설정 부여(Android 11 이상 대응) 서론지난 포스팅에서 언급한 대로 이번 포스팅은 미리 사용하게 될 기술들을 간단히 개발하면서 검증하는 과정에서 블로그에 올리면 좋을 것 같아서 포스팅으로 올리게 되었다.이번 포스팅에서는 저장소 권한 부여 기능을 검증하면서 겪은 시행착오와 적용 방법에 대해 설명해 보겠다. 저장소 권한텍스트 추출기 앱은 txt를 합성하는 게 핵심 기능이 될 듯해서 기존에 사용자가 가지고 있던 txt까지 불러와 합성할 수 있도록 하는 게 매우 중요했다.그래서 모든 파일을 불러올 수 있는 권한이 필요하게 되었는데, 이 권한이 Android 10(API 29)에 올라오면서 변경되게 되었다고 한다. 기존에는 개발자가 WRITE_EXTERNAL_STORAGE, REA.. 2025. 5. 28.
[기획] 텍스트 추출기 앱 설계 텍스트 추출기 앱 기획 서론Planner 앱 출시 이후, 군대 가기 전에 앱 하나 더 출시하고 가자는 생각에 아이디어를 몰색하다가 텍스트 추출기 앱을 떠올리게 되었다.이번 포스팅에서는 텍스트 추출기 앱을 떠올리게 된 아이디어와 어떤 기능을 담을 건지 간단하게 작성해보고자 한다. 아이디어 선정전부터 웹소설을 보던 것을 즐겼었다.웹소설 플랫폼은 네트워크가 안 통하는 지역에서는 사용이 불가하기 때문에 텍스트로 따 저장하는 텍본이라는 방식으로 웹소설을 즐기는 사람이 많다.텍본으로 자신이 재미있게 본 웹소설을 저장하려고 만드는 사람들도 많다. 나도 내가 재미있게 본 웹소설들을 텍본으로 만들고 싶었다.pc에서 하는 방법은 많이 나와 있었지만, 모바일에서 하는 방법은 많이 나와있지 않았다.그래서 OCR(광학 문자.. 2025. 5. 27.
[후기] Planner 앱 출시 후 회고 Planner 출시 후기 서론공군 준비를 하면서 꽤 길게 블로그 휴식기를 가졌다.사실은 공군 준비를 하면서 개발하기 귀찮음이 더 커서 블로그에 쓸 게 없어서 블로그를 안 쓰게 되었던 것 같다.최근에 공군 모집병 최종 합격(7월 말 입대)하면서 마지막 불꽃을 태워 앱을 출시해 보고 가겠다고 마음을 먹어서 기존에 다 만들어 놓고 출시를 안 하고 있던 Planner를 기능적, UI적으로 손을 보고 비공개 테스트를 거쳐서 출시하는 데 성공했다. 이번 글에는 출시하기까지의 과정을 간략히 설명하고 출시 후기를 남겨볼까 한다. Planner 출시 완료Planner를 손보고 나서 비공개 테스트를 어떻게 할지 찾아보다가, 비공개 테스트를 위한 오픈 채팅방을 찾게 되었다.바로 들어가서 비공개 테스트를 진행했다. 내가 .. 2025. 5. 27.
[Kotlin, S4] 백준 20363번 당근 키우기 당근 키우기(20363번)Silver 4#수학 #그리디 알고리즘 문제 링크https://www.acmicpc.net/problem/20363 문제 내용 문제 접근햇빛과 수분을 줄 수 있을 때, 한 항목에 10을 주면 다른 항목이 1이 감소할 때 x, y를 정확히 맞추는 합의 최솟값을 구한다. 예제 2를 기준으로 설명하자면,온기(x)는 123456만큼, 수분(y)은 12345만큼 필요하게 된다.그러면 최소 123456 + 12345 만큼은 햇빛, 물을 주는 횟수가 필요해지게 된다. 123456 + 12345만으로는 x, y를 모두 채울 수가 없다.햇빛을 먼저 채운다고 가정하면 1. sun = 123456, water = 0 2. sun = 122222, water = 12345의 상태가 되게 된다. sun.. 2025. 3. 16.
[Android, Kotlin] 새로워진 Navigation Compose의 safe args 적용하기 서론이번에 compose 프로젝트를 진행하면서 화면 이동 시 인자를 전달하는 safe args를 다시 사용하게 되었는데, safe args가 이번 compose 최신 업데이트로 더 편리하게 구현할 수 있도록 변경된 것 같아서 이번 기회에 어떻게 구현하는지 정리해 보려 한다. Navigation 2.8.0의 safe args 변경 사항이번에 Navigation의 버전이 2.8.0-alpha08 버전으로 업그레이드되면서 kotlin의 Serializable을 통해 인자를 넘길 수 있게 변경되었다. Serializable을 통해 data class로 화면을 정의하고 data class의 필드로 값을 전달할 수 있다.그러면 바로 어떻게 구현하는지 알아보자. Serializable, Navigation 추가lib.. 2025. 1. 23.
[Kotlin, S1] 백준 2468번 안전 영역 안전 영역(2468번)Silver 1#그래프 이론 #브루트포스 알고리즘 #그래프 탐색 #너비 우선 탐색 #깊이 우선 탐색 문제 내용 문제 접근n * n의 영역에서 내리는 비의 양에 따라서 잠기는 영역이 생기게 된다.영역이 3일 때, 비의 양이 3 이상이면 모든 영역 3이 잠기게 된다. 영역의 개수는 상하좌우에 붙어있는 모든 안전 영역들은 하나로 간주한다.대각선의 안전 영역은 모두 별개의 안전 영역이 된다. 내리는 비의 양에 따라 잠기는 영역의 수가 달라지게 될 것이다.물에 잠기지 않은 영역의 수의 최대 개수를 구한다. 비의 양은 영역에서 가장 작은 값에서부터 가장 큰 값까지 정의하고 탐색해 보면 될 거라고 생각하기 쉽다.하지만 영역에서 가장 큰 값으로 구해봤자 모든 영역이 잠기게 되기 때문에 굳이 구할 .. 2025. 1. 19.
[Kotlin, G5] 백준 11000번 강의실 배정 강의실 배정(11000번)Gold 5#자료 구조 #그리디 알고리즘 #정렬 #우선순위 큐https://www.acmicpc.net/problem/11000 문제 내용  문제 접근강의실을 최대한 적게 사용해 n개의 수업을 모두 진행해야 한다.강의의 시작 시간과 종료 시간을 참고해 모든 강의를 진행하는 데 필요한 최소 강의실의 개수를 구해야 한다. 각각의 강의들 중 강의 시작 시간이 강의 종료 시간보다 작거나 같을 때는 한 강의실에서 같이 들을 수 있다.예를 들어 시작 시간이 1이고 종료 시간이 3인 강의와 시작 시간이 3이고 종료 시간이 5인 강의는 한 강의실에서 같이 들을 수 있다.  강의들 중 제일 먼저 시작하는 강의부터 시작해 한 강의실에서 쓸 수 있는 강의들을 모두 제거하면서 문제를 해결하면 된다.예.. 2025. 1. 18.
[Kotlin, S2] 백준 14247번 나무 자르기 나무 자르기(14247번)Silver 2#그리디 알고리즘 #정렬 문제 내용  문제 접근n일 동안 나무를 잘라서 얻을 수 있는 나무의 최대 양을 구한다.첫날의 나무는 n개의 나무가 각각 h의 높이를 이루고 있고 날이 지날 때마다 hⁱ 에 해당하는 aⁱ 만큼 나무가 자라게 된다. 문제를 보면 날마다 자라는 나무의 높이가 다르기 때문에 매일 제일 높이가 높은 나무를 고르는 것으로 문제를 해결할 수 있다고 생각하기 쉽다.하지만 그 방법은 최적해가 아니다. 우리는 제일 덜 자라는 나무부터 시작해서 제일 잘 자라는 나무 순서대로 나무를 골라야 한다.나무가 잘 자랄수록 나중 갈수록 나무의 높이가 매우 커지기 때문에 매일 제일 높이가 높은 나무를 고르는 것보다 더 많이 나무를 고를 수 있데 된다. 이제 이 아이디어를 .. 2025. 1. 14.
[Kotlin, S1] 백준 2205번 저울 추 만들기 저울 추 만들기(2205번)Silver 1#수학 #그리디 알고리즘https://www.acmicpc.net/problem/2205 문제 내용  문제 접근1부터 n까지의 무게를 가진 납과 주석을 합쳐서 2의 제곱수의 무게를 가지는 저울추를 만들어야 한다.각 무게를 가지는 덩어리는 중복해서 사용이 불가능하다. n이 1부터 5까지 이루어져 있을 때, n이 5일 때는 3을 대입해서 8을 만들 수 있다. 4일 때는 주석의 무게를 추가해서 (4, 4) 조합으로 8을 만들 수 있고 주석이 3일 때는 (3, 5)의 조합으로 저울추를 만들 수 있다.정의된 무게를 만들기 위해 주석이 커지면 납이 작아지고, 납이 커지면 주석이 작아지는 특징을 이용해 중복을 허용하지 않고 주석의 무게를 구성할 수 있게 된다. 저울추의 무게는.. 2025. 1. 7.
[Kotlin, S2] 백준 1780번 종이의 개수 종이의 개수(1780번)Silver 2#분할 정복 #재귀https://www.acmicpc.net/problem/1780 문제 내용  문제 접근종이가 -1 또는 0 또는 1로 모두 채워지지 않았을 때, 정확히 9등분을 해 다시 종이가 -1 또는 0 또는 1인지 확인해서-1, 0, 1로 채워진 종이의 개수를 세서 출력하면 된다. 시작 좌표와 확인할 size를 정한 다음, 시작 좌표에서 size만큼의 범위를 확인해 숫자의 개수를 세주는 방식의 재귀 호출을 통해 해결할 수 있다.  문제 해결 코드더보기import java.io.BufferedReaderimport java.io.InputStreamReaderprivate var paper = arrayOf(arrayOf())private var cntMinu.. 2024. 12. 18.
[Kotlin, S3] 백준 32186번 역시 내 이세계 수열은 잘못됐다 역시 내 이세계 수열은 잘못됐다(32186번)Silver 3#수학 #그리디 알고리즘https://www.acmicpc.net/problem/32186 문제 내용  문제 접근각 위치에 맞는 index의 값 2개를 +k 연산과 +1 연산을 이용해 같은 값으로 만들어야 하는 최소 연산 횟수를 출력한다. 값 2개 중 작은 값을 큰 값에 딱 맞게 만드는 방법과작은 값에 +k 연산을 반복해 큰 값보다 커지도록 만들고 큰 값에 +1 연산을 해서 값을 맞추는 방법이 있다. 예를 들어 k가 7이고 5와 28이 매칭되는 값일 때5를 28로 만들기 위해서는 5에 7을 3번 더하고 1을 2번 더하면 28이 된다(연산 횟수 5번).그리고 5에 7을 4번 더하면 33이 되는데, 28에 1을 5번 더하면 두 값이 모두 33이 된다.. 2024. 12. 18.
[Kotlin, B1] 백준 10275번 골드 러시 골드 러시(10275번)Bronze 1#수학 #구현https://www.acmicpc.net/problem/10275 문제 내용  문제 접근a, b 중에 하나를 2의 제곱수만을 이용해 만들어야 한다.예를 들어 24는 16 + 8로 만들 수 있는데, 이때 차수가 가장 적은 수를 만들기 위해 2의 n제곱한 수에서 몇 번을 반으로 잘라야 만들 수 있는지 구하면 된다.a, b에 정확히 요구된 수만큼만 들어가야 한다는 것과 a + b가 2의 n제곱과 같기 때문에 a와 b 중 하나만 구해도 나머지를 구할 수 있게 되기 때문에 이를 생각하게 되면 하나만 구해도 된다는 것을 알게 될 것이다.  문제 해결 코드더보기import java.io.BufferedReaderimport java.io.InputStreamRead.. 2024. 12. 14.
[Kotlin, S2] 백준 26007번 Codepowers Codepowers(26007번)Silver 2# 누적 합 문제 내용  문제 접근각 쿼리는 시작 라운드(포함), 종료 라운드(미포함)의 사이에 진행된 라운드마다의 현재 레이팅을 구해서 k보다 낮은 레이팅의 개수를 구해서 출력하면 된다. 문제 내용은 단순하지만 왜 silver 2씩이나 받았는지 생각해봐야 한다.  문제 해결 코드더보기import java.io.BufferedReaderimport java.io.InputStreamReaderimport java.util.StringTokenizerfun main() { val bf = BufferedReader(InputStreamReader(System.`in`)) // n: round, x: 초기 레이팅, m: 쿼리의 개수, k: 낮은 레이팅.. 2024. 12. 3.
[Kotlin, S4] 백준 2090번 조화평균 조화평균(2090번)Silver 4#수학 #구현 #정수론 #유클리드 호제법 문제 내용  문제 접근입력받는 수들을 모두 역수로 바꾼 값들의 합을 분수 형태로 변환 후 그 값의 역수를 출력하는 문제이다.1, 2, 4가 들어왔으면 1 + 1/2 + 1/4 = 7/4를 역수로 출력해서 정답이 4/7이 되는 방식이다. 입력값들의 역수를 더하려면 통분이 필요한데, 통분은 입력값들의 최소공배수를 이용해 통분을 진행하면 된다.주의해야 하는 점은 출력을 가장 적은 수의 문자를 사용하는 답을 출력하라고 돼 있는데, 이를 쉽게 풀면 약분해서 출력하라는 뜻이기 때문에 약분까지 진행해서 출력해야 한다.  문제 해결 코드더보기import java.io.BufferedReaderimport java.io.InputStreamRea.. 2024. 11. 25.
[Kotlin, S4] 백준 16471번 작은 수 내기 작은 수 내기(16471번)Silver 4#그리디 알고리즘 #정렬https://www.acmicpc.net/problem/16471 문제 내용 문제 접근사장님이 뽑은 카드에서 이기기 위해 낼 수 있는 가장 큰 카드를 계속 냈을 때, 더 이상 이기는 수가 없을 경우, 이긴 횟수에 2를 곱해서 카드의 개수보다 크다면 YES를 출력하고, 아니면 NO를 출력하면 된다. 입력 예제를 예로 들면,2 1 3 5 61 1 3 2 5 아래가 사장님의 카드고, 위가 주언의 카드일 때, 사장님이 카드를 큰 순서대로 뽑게 되면 5, 3, 2, 1, 1의 순서대로 뽑게 된다.주언이 카드를 뽑아 사장님을 이기려면,사장님이 5를 뽑았을 때, 5보다 작은 카드인 1, 2, 3 중에서 제일 큰 3을 고르고,사장님이 3을 뽑으면 주언이.. 2024. 11. 17.
[Kotlin, S5] 백준 11116번 교통량 교통량(11116번)Silver 5#구현 #브루트포스 알고리즘https://www.acmicpc.net/problem/11116 문제 내용  문제 접근다리의 왼쪽에서 오는 차들(들어오는 차)의 시간과 오른쪽으로 나가는 차들의 시간이 주어졌을 때, 문제에 언급된 규칙을 이용해 다리를 지난 차들이 몇 대인지 구하면 된다. 왼쪽에서 오는 차의 시간이 t, t + 500이고, 오른쪽으로 나간 시간이 t + 1000, t + 1500이 있는 경우가 다리를 지난 차가 된다.  문제 해결 코드더보기import java.io.BufferedReaderimport java.io.InputStreamReaderfun main() { val bf = BufferedReader(InputStreamReader(Syste.. 2024. 11. 15.
[Android] thread와 함께 알아보는 coroutine, flow에 대한 고찰 이번 고찰의 주제는 coroutine이다.kotlin을 사용했거나, 사용 중인 개발자들에게는 항상 따라다니는 비동기 처리 개념이다.이번 포스팅으로 확실하게 궁금했던 것들을 공부하면서 짚고 넘어갈 예정이다. coroutine이란?coroutine은 thread 안에서 실행되는 일시 중단 가능한 작업 단위이다.하나의 thread에서 여러 coroutine이 서로 thread를 양보해 가며 실행될 수 있다. 그러면 어째서 coroutine이 생겨나게 된 걸까? coroutine은 왜 사용하게 되었을까?thread 기반의 다중 thread 작업의 한계coroutine 이전의 동시성 작업은 모두 thread 기반으로 이루어졌다.thread 기반으로 작업을 수행하게 되면 thread 1의 작업이 진행되는 중에 다른.. 2024. 11. 12.
[Android] liveData, stateFlow와 함께 보는 MVVM에 대한 고찰 이번 포스팅에서는 저번 포스팅에서 언급했다시피, clean architecture와 함께 실무에서 반필수적으로 사용되는 디자인 패턴인 mvvm에 대해 공부해서 적어보고자 한다.마찬가지로 공부하면서 참고한 포스팅도 같이 링크로 남겨 놓겠다. MVVM은 무엇일까?MVVM에 관해서는 찾아보면 자료가 많이 나오기 때문에 간단하게 정의해 보면,MVC와 MVP에서 view와 엮이는 의존성을 해결하기 위해 view model을 도입한 디자인 패턴.MVVM은 model, view, view model의 약자다. 여기서 view model과 view는 1 : n의 관계를 가질 수 있다는 특징을 지닌다. MVVM을 왜 쓰는 걸까?mvvm 디자인 패턴은 다음과 같은 장점을 가진다.의존성 최소화view는 view model을.. 2024. 11. 11.
[Android] hilt와 함께 보는 clean architecture에 대한 고찰 이번 포스팅에서는 Android 개발에서 왜 clean architecture를 사용하는지, 그리고 내가 clean architecture에 관해서 궁금했던 것들을 공부해서 적어 보고자 한다. 내가 공부하면서 참고한 포스팅도 함께 남길 테니 더한 내용이 궁금하면 확인해 보는 것도 좋겠다. clean architecture의 정의정의는 다른 포스팅에도 자주 언급되기 때문에 간단하게 설명하겠다.clean architecture는 소프트웨어 시스템의 구조를 설계할 때 지켜야 할 원칙과 방법을 정의한 개념.복잡한 소프트웨어 시스템을 보다 관리 가능하고 유지 보수 가능한 형태로 구축하기 위한 지침을 제공한다. 간단하게 요약하자면, 규모가 큰 소프트웨어를 설계할 때 지켜야 하는 구조 같은 거라고 이해하면 될 것 같.. 2024. 11. 8.
[Kotlin, S2] 백준 2232번 지뢰 지뢰(2232번)Silver 2#그리디 알고리즘 #정렬https://www.acmicpc.net/problem/2232 문제 내용  문제 접근지뢰를 모두 터트리는 최소 개수를 구해야 한다.직접 터트리는 지뢰의 개수를 최소로 하려면 연쇄적으로 터지는 지뢰의 개수가 많은 곳을 위주로 터트리면 된다. 직접 터트리는 지뢰의 위치에서 왼쪽 방향은 오름차순으로 수가 정렬되어 있어야 하고, 오른쪽 방향은 내림차순으로 정렬되어 있어야 한다.예를 들어 다음과 같이 지뢰가 있을 때,1 2 5 4 3 3 6 6 2 3, 7, 8번의 지뢰를 직접 터트리면 모든 지뢰를 제거할 수 있다.  지뢰가 연쇄적으로 터지려면 왼쪽은 오름차순으로 중복 없이 정렬되어 있어야 하고, 오른쪽은 내림차순으로 중복 없이 정렬되어 있어야 한다. 오름.. 2024. 10. 21.
[Kotlin, B1] 백준 31432번 소수가 아닌 수 3 소수가 아닌 수 3(31432번)Bronze 1#수학 #애드 혹 #정수론 문제 내용  문제 접근n개의 숫자를 사용해서 소수가 아닌 수가 있으면 yes를 출력하고 소수가 아닌 수 하나를 아무거나 출력하고, 소수가 아닌 수가 없을 때는 no를 출력하는 문제이다.각 숫자는 중복해서 사용할 수 있다. 약간의 수학적 고민이 필요한 문제이다. 같은 숫자를 중복해서 쓸 수 있다는 경우 때문에 no가 나오는 경우는 하나도 없다.n개의 숫자가 2, 3, 5, 7인 경우에는 n의 숫자들이 모두 소수이지만, 같은 숫자를 여러 번 쓸 수 있으면 22, 33, 55, 77처럼 소수가 아닌 수를 언제든지 만들 수 있다는 뜻이 되기 때문에 n에 어떤 수가 나와도 no가 나오는 경우가 없어지는 것이다. 그러면 정답을 같은 수를 사용.. 2024. 10. 17.
728x90
반응형