본문 바로가기

분류 전체보기

(159)
[TIL] 24.03.14 사이드 프로젝트: Hilt 적용하기 1. 사이드 프로젝트: Hilt 적용하기 ❗ 빌드 설정 이슈 사이드 프로젝트를 진행하면서 늘 하던 것처럼 Hilt를 이용해 DI를 적용하려고 했는데, 에러가 생겼다. Check that your Kotlin version is >= 1.0: java.lang.IllegalStateException: Unsupported metadata version. Check that your Kotlin version is >= 1.0 예전에도 한번 겪은 오류인데, 실제로 내가 코틀린 버전을 1.0 미만으로 사용하고 있는 것은 아니고, 아마 build 파일들을 설정할 때 뭔가 누락해서 발생한 것이었을 것이다. buildscript { dependencies { ... classpath("com.google.dagge..
[TIL] 24.03.13 3주차 개인 과제 1. 3주차 개인 과제 이번 주차 과제를 얼추 마무리 했다. 몇몇 요구사항은 저번에 작성한대로 고민을 좀 하다가 타협해서 구현했다. 내가 코틀린 자체에 익숙한게 맞는가 싶어서, 다양한 기본 라이브러리 요소를 써보려고 노력했던 것 같다. 항상 아침에 코드카타라고 간단한 알고리즘 문제를 풀면서 시작하는데, 계속 C++로 풀다가 요즘들어 코틀린으로 풀면서 내가 코틀린 이해도가 좀 낮다는 생각이 들었기 때문이다. 원래부터 코딩 테스트를 C++로 준비했고, 학교 수업 때도 진득하게 써서 언어 측면에서 보면 C++은 익숙한데 코틀린은 마냥 그렇지 않았다. 안드로이드를 구현하는데에 자주 쓰이는 코틀린 라이브러리들이야 익숙하지만, 그렇지 않은 라이브러리들을 쓸 때 좀 버벅이는 느낌? 이런 이유로, DateTime이나 ..
[TIL] 24.03.11 사이드 프로젝트, 3주차 개인과제 1. 사이드 프로젝트 주말 동안 기본 로직을 조금 구현해 놨다. Paging3를 적용하기 애매했던 부분이 있어서, 일단 자체적으로 페이징 처리를 해줄 수 있는 클래스를 만들었다. 검색하려고 하는 키워드를 전달받아 이미지와 동영상 api를 각각 검색해서 병합 후 최근 업로드 순으로 정렬해 출력한다. 이 때, View에서 한 번에 뿌려지는 데이터의 수를 n이라고 하면, 이미지와 동영상 api에서 각각 n개를 받아오도록 했다. 이는 이미지와 동영상을 통합해서 검색하는 api를 이용하는 것이 아니기 때문에, 확실하게 시간 순 정렬을 보장하기 위함이다. 사실 조금 더 퍼포먼스를 챙기자면(특히 공간 측면), 이미지와 동영상에서 각각 몇 개씩 소모되었는지 확인해서 소모된 만큼만 api에서 받아와도 무방하지만, api..
[TIL] 24.03.08 알고리즘 1. 알고리즘 문제 해결 최소 회의실 개수(백준 19598): 어제 풀었던 것과 마찬가지로 우선순위 큐를 이용하는 문제다. 회의 배열의 크기와 주어질 수 있는 시간의 최대값이 충분히 작다면 배열 하나와 브루트 포스를 이용할 수도 있겠지만, 이 문제는 그러기엔 큰 수들이 주어질 수 있다. 사실 시간 진행에 따라 회의들의 타임 테이블을 나란히 두고 생각해보면 모든 시간에 대해 회의실 수를 따져볼 필요는 없음을 알 수 있다. 모든 회의들을 탐색하면서, 회의가 시작하는 시점에 필요한 회의실 수만 따져줘도 충분하다. 특정 회의가 시작되는 시점을 기준으로 필요 회의실 수를 계산하려면, 진행되려고 하는 회의의 시작 시간보다 끝나는 시간이 빠른 회의들을 진행 중인 회의 목록에서 제거하고, 남은 회의들의 수를 세면 될 ..
[TIL] 24.03.07 알고리즘, 사이드 프로젝트 1. 알고리즘 문제 해결 가운데를 말해요(백준 1655): 발상해내는데 꽤 걸린 문제다. 매번 정렬을 하면서 풀자니 O(n^2 log n)으로 시간 초과가 날 것이다. 일반적인 정렬 알고리즘이 아닌 Radix Sort나 Counting Sort를 써도 원소를 입력받을 때마다 반복한다면 O(n^2)을 넘기 때문에, 이 또한 불가능하다. 전체 동작 시간이 O(n log n) 선에서 끝나야 했다. 그래서 매번 리스트에 대해 이진 탐색으로 들어갈 자리를 찾아 삽입하고, 중앙값을 출력하게 해 볼까도 생각했다. 하지만 배열 기반 리스트라면 삽입 과정에서 O(n)이 걸리고, 연결 리스트라면 이진 탐색이 힘들어 보였다. 어쨌든 입력은 n번을 받아야하고, 결국 입력을 받으면서 매번 O(log n)의 연산을 통해 중앙값을..
[TIL] 24.03.06 알고리즘, 2주차 개인과제 1. 알고리즘 문제 해결 가장 긴 증가하는 부분 수열(백준 11053): 줄여서 LIS로 익히 알려진 그 문제이다. 여기서는 주어지는 수열의 크기가 최대 1,000개이기 때문에 O(n^2)의 DP로 간단하게 구현할 수 있다. 이 때 DP 배열이 가지는 값은, 해당 인덱스의 값을 수열의 가장 끝이라고 생각할 때 얻을 수 있는 LIS의 길이이다. 그 값을 얻기 위해서는 앞의 인덱스들에 대해 DP 배열을 모두 탐색보아야 하므로, 결과적으로 O(n^2)이 된다. 내 기억으로는 이진탐색을 활용해서 O(n log n)으로 해결되는 문제였던걸로 기억하는데, 취약한 DP 문제들을 충분히 연습하고 나면 찾아서 풀어봐야겠다. #include #include using namespace std; int main() { ci..
[TIL] 24.03.05 알고리즘, 2주차 개인과제 1. 알고리즘 문제 해결 퇴사 2(백준 15486): 이번 문제도 DP 문제이다. 입력으로 들어오는 n이 1,500,000개까지 주어질 수 있기 때문에, 문제를 보자마자 떠올릴 수 있는 O(n^2)의 방법으로는 해결할 수 없다. DP로 풀게 되면 O(n)이 될 것 같아서, 그렇게 접근해봤는데 선뜻 점화식이 명확하게 떠오르지 않았다. 1일차 상담 일정부터 탐색하게 되면 기간에 따른 제약사항을 반영하기 까다로웠다. 그래서 역방향인 N일차부터 계산하는 방법을 썼다. 만약 일정표의 걸리는 기간을 탐색 중인 일자 i에 더했을 때, N 이하라면 할 수 있는 상담이라는 의미이다. 그렇다면 dp[i+걸리는 기간] 값에 이 상담으로 얻을 수 있는 수익을 더한 값과 dp[i+1] 값을 비교해 더 큰 값을 dp[i] 값으로..
[TIL] 24.03.04 알고리즘, 1주차 프로젝트 회고 1. 알고리즘 문제 해결 문제 출제(백준 2854): 경우의 수를 따지는 DP 문제이다. 처음에는 DP 테이블을 구성할 때, 비연속적인 난이도의 문제를 선택하는 경우와 연속적인 난이도의 문제를 선택하는 경우, 두 경우로만 나누려고 했다. 그런데 그렇게 처리하려고 하니, 계산하기가 영 까다로웠다. 난이도가 n인 문제를 채택할 때 세 가지의 케이스는 따져야 할 것 같았다. - 난이도 n의 문제를 선택하는 경우 - 난이도 n-1 또는 n의 문제를 선택하는 경우 - 난이도 n 또는 n+1의 문제를 선택하는 경우 첫 번째와 세 번째 케이스는 난이도 n-1인 문제를 채택하는 방법에 영향을 받지 않는 것이 자명하다. 따라서 난이도 n-1인 문제까지 선택한 경우의 수에 단순하게 곱해서 DP 테이블을 채울 수 있다. 하..