본문 바로가기

Dev

(90)
[백준 1562] 계단 수 DP를 이용해야 하는 문제다. 일단 대강 로직을 떠올렸을때, 1번째 자리~N번째 자리에 이르기까지 각각 들어갈 수 있는 수의 범위인 0~9에 대하여 해당 지점까지의 '계단 수'의 수를 계속해서 저장해나가면 되겠다 싶었다. 그런데 문제 조건에서 0~9까지 모든 숫자가 등장해야 한다는 조건을 걸었으므로, 결국 계단 수가 형성되는 경로가 저장되어야만 한다. 따라서 직관적이고 단순한 DP 테이블을 떠올리면 크기가 최대 10*100*경로 집합의 수인 int 테이블이 필요하게 될 것이고, 이는 메모리 초과에 이른다.   그렇기 때문에, 비트 마스킹을 통해서 모든 경로를 저장하는 것이 아닌 방문 정보(숫자의 등장 정보)만을 저장해준다. 결국 필요한 것은 모든 숫자를 이용했는가를 판단하는 것이기 때문에 모든 경로가 저..
Unable to load class 'org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinCompilationData' 오류 Unable to load class 'org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinCompilationData' Compose나 ksp 같은 비교적 최신 기술들을 적용해 개인 프로젝트를 해보고 있는데, gradle 파일에서 dependency를 추가하다가 위와 같은 오류가 발생했다. 아무래도 ksp의 버전을 공식문서 그대로 사용했더니, 다른 빌드 환경에 호환되지 않는 부분이 있었던 것 같다.   내가 설정했던 ksp 버전은 위와 같은데, 일단 공식 문서에서 안내하는대로 먼저 내 코틀린 버전과의 호환부터 체크해보기로 했다.  쭉 살펴보니 코틀린 버전과, ksp 버전의 앞쪽 버전 넘버가 맞아야 동작하는듯 했다. 코틀린 1.9.0에 대응하는 버전은 아무래도 1.0..
[백준 1202] 보석 도둑 그동안 포트폴리오랑 자기소개서를 작성하느라 공부를 많이 하지 못했는데, 어느정도 틀은 완성한 것 같아서 조금 여유가 생겼다. 아직 고칠 부분이 많지만 이제 다시 공부를 병행할 수 있을 것 같다. 더군다나 알고리즘 문제는 부트캠프 최종 프로젝트 기간동안 손을 놨다가 오랜만에 푸는 것이고, 이렇게 내일배움캠프가 아닌 카테고리에 개별 포스트로 작성하는 것도 처음이기 때문에 감회가 새롭다.   문제가 심플하면서 묻고 있는 것이 명확하다. 그런데 알고리즘 문제를 너무 오랜만에 풀었더니 이 문제에서도 꽤 난항을 겪었다. 당연히 보석과 가방 리스트를 그대로 이용하게 되면 절대 제한 시간 안에 풀 수 없다. 그래서 가방을 내림차순으로 정렬하고, 우선순위 큐를 통해 보석을 가치가 크면서 무거운 보석이 먼저 나오도록 해두..
[TIL] 24.06.05 안드로이드 스튜디오 에뮬레이터 Extended Contorls의 location이 제대로 동작하지 않을 때 안드로이드 스튜디오의 에뮬레이터의 Extended Controls 패널을 보면 저렇게 Location을 설정하고, Route를 play 할 수 있는 기능도 지원한다. 그런데 오늘 지도 API를 테스트 하려고 해당 기능을 오랜만에 동작시켰는데 저 하얗게 표시한 부분에 지도가 제대로 뜨지 않았다. 지도의 메뉴(검색, 줌 인/아웃 버튼)는 뜨는 상태인데, 지도는 정상적으로 로드되지 않고 그냥 흰 화면만 뜨는 상태였다.  당최 이유를 알 수 없어서 꽤나 고생을 했다. 당연히 안드로이드 스튜디오와 에뮬레이터 재부팅은 해봤고, 캐시도 날려봤지만 지도가 뜨지 않았다. 처음에는 에뮬레이터 내에 연동된 구글 시스템에 문제가 있나 싶어서, 구글 계정을 다시 로그인 해보고 구글 맵을 켜서 위치 정보를 확인했더니 그 곳에서는..
[TIL] 24.06.04 Firebase의 Realtime Database와 Cloud Firestore 최종 프로젝트를 한창 진행 중에 있는데, Firebase를 이용한 원격 DB를 도입하게 되면서 고민해야 하는 부분이 생겼다.처음에 당연히 DB의 변화를 실시간으로 감지해서 UI에 변화를 발생시켜야 하는 부분이 많을 줄 알고(일종의 flow를 내려주는 격), Realtime Database를 채택했는데 앱의 윤곽이 잡히고 나니 생각보다 그런 부분이 적은듯 했다. 그래서 어떤 것을 도입할 지 공식문서를 읽어보면서, 확실하게 결정해서 리팩터링을 진행하기로 했다.Choose a database: Cloud Firestore or Realtime Database  |  Firebase (google.com) 데이터베이스 선택: Cloud Firestore 또는 실시간 데이터베이스  |  Firebase5월 14일..
[Android] SharedFlow 사용 시, 늦게 생성된 View에서의 초기 값 문제 📝 문제 발생  LiveData를 StateFlow와 SharedFlow로 리팩터링 하던 도중, 사소한 문제가 생겼다. 특정 SharedViewModel의 LiveData를 Observe 해서 UI에 반영하는 코드가 있었는데, 리팩터링 이후 초기 값을 제대로 불러오지 못하는 문제였다. 해당 Fragment 탭을 눌러서 그 Fragment가 생성된 이후에, SharedFlow로 방출되는 event들은 제대로 반영이 되고 있으나, 초기값은 의도한 대로(가장 마지막 event를 이용해 초기화) 동작하지 않았다.  그래서 해당 SharedFlow를 collect하는 블럭에 Log를 찍어서 확인해 봤는데, View의 초기화 시점에는 해당 블럭이 트리거되지 않고 있었다.    📌 다양한 비동기 스트림과 문제 원..
[Android] Kotlin DSL 이용 시, API Key 은닉하기(AGP 9.0 미만) 흔히 토이 프로젝트 등을 할 때 api 키와 같은 정보를 local.properties에 은닉하곤 하는데 groovy를 사용할 때와 소소한 차이가 있어서, 오랜만에 작성하면 낯설게 느껴진다. 이번 기회에 글로 남기면서 정리하려고 한다. 1. local.properties에 키 값 작성하기 local.properties에 키 값을 이름=문자열 꼴로 작성한다. 당연히 이 파일은 형상 관리 시스템에서 제외되어야 한다. 2. 앱 수준 build.gradle에서 Properties 객체 생성 후, local.properties 파일 불러오기 사실 파일이 존재하는지 한번 확인하면 더 견고한 프로그램이 될 것 같다. 3. buildConfig에 등록하기 defaultConfig에서 지정하긴 했지만, 당연히 build..
[안드로이드 짤막공부] 23.09.30 카카오 API를 이용한 미디어 검색 앱을 만들던 도중, 오랜만에 오류를 겪었다. 대강 이런 오류였는데 아무래도 API를 통해 받아온 데이터를 바인딩하는 과정에서 오류가 나는 거 같았다. 유독 VideoItem의 playTime을 받아올 때만 오류가 발생했다. 처음에는 API의 response 값을 받아올 때 VideoItem에 대해 잘못된 값을 참조해서 존재해야 할 값이 없는가 해서 Postman으로 직접 API를 호출해 보니, response로 주어지는 인자들의 이름은 모두 제대로 SerializedName으로 처리해 둔 상태였다. 실제로 Retrofit 객체를 통해 전달받은 데이터들을 Log로 찍어 확인해 본 결과 모두 정상적으로 받아 오고 있었다. 그래서 문제가 발생한 ItemVideoBinding..