2024/11 16

디베이터 - 반론

#1 개요나는 살아오는 내내 갈등이 두려웠다. 일상에서는 언쟁을 피하고 무시하며 그것으로부터 숨으려고 노력했다. 대답을 회피하고 농담으로 에두르는 기술이 늘어갔다. 이 열성적인 갈등 회피 덕에 친구들은 나를 좋아했다. 친구들이 사소한 다툼에 시간을 낭비하는 동안 나는 모두와 사이좋게 지내는 편안함을 즐겼다.갈등 회피는 21세를 살아가는 우리에게 더없이 자명한 지혜처럼 보인다. 우리의 공공생활의 특징 중 하나가 합리적 논쟁의 부재라면, 또 다른 특징은 정치적 반대 집단들 간에 점점 커져가는 증오와 적대감이다. 이런 분노의 정치와 문화 전쟁의 시대에 갈등은 오히려 삶의 신중한 선택일 뿐 아니라 (현대인의) 미덕처럼 보였다.그렇게 나는 모순적인 삶을 살고 있었다. 토론대회에서는 기를 쓰고 위로 올라갔지만 일상..

책/자기 계발 2024.11.30

Nutri Capture 프론트엔드 - INSERT 및 DELETE 버튼 구현

#1 개요레코드를 INSERT하는 버튼과 DELETE하는 버튼을 각각 구현한다.  #2 코드 - 깨알 수정...@Composablefun NutrientScreen( ...) { ... LazyColumn( ... ) { ... itemsIndexed(...) { ... -> Card( ... elevation = CardDefaults.cardElevation(4.dp) ) { ... } } }}레코드 하나하나를 감싸는 Card의 그림자값을 줄인다. 그림자값이 8.dp면 다른 카드 영역에까..

Nutri Capture 백엔드 - DeleteDayMeal 이벤트 추가

#1 개요최근 프론트엔드에서는 DayMealView 테이블만을 사용하므로, NutrientViewModelEvent.kt에 정의해두었던 DeleteMeal()이 사용될 일이 없다. 따라서, DeleteDayMeal() 이벤트를 새로 만든다. #2 코드#2-1 NutrientViewModelEvent.kt...sealed class NutrientViewModelEvent { ... data class DeleteMeal(val meal: Meal) : NutrientViewModelEvent() data class DeleteDayMeal(val dayMeal: DayMealView) : NutrientViewModelEvent()}본 게시글의 목적과 별개로, NutrientViewMod..

[백준] 10026 (적록색약)

#1 알고리즘#1-1 탐색 문제누가봐도 탐색 문제처럼 생겼다. 그렇다면 어떤 탐색을 수행할 것인가? #1-2 탐색 목표RRRBBGGBBBBBBRRBBRRRRRRRR나는 위 테스트 케이스에서 각 알파벳 하나씩을 순회하며, 1113322333333443344444444∴ 색맹 아닌 기준으로 구역의 수는 총 4개와 같은 식으로 변경할 것이다. '인접한 같은 색'끼리는 같은 숫자를 공유하고, '인접한 다른 색'은 서로 다른 숫자를 지닌다. 이렇게 만들려면, 인접한 다른 색으로 가기 전에 먼저 인접한 같은 색에 서로 같은 숫자를 마킹하는 로직이 필요하다. #1-3 Deque 활용 Double-ended queue - WikipediaFrom Wikipedia, the free encyclopedia Abstrac..

Nutri Capture 백엔드 - DAO 논리적 오류 수정

#1 개요프로젝트의 데이터베이스(Room) 부분에서 작성했던 DAO 함수의 논리적 오류를 해결한다. #2 논리적 오류 - ORDER BY#2-1 문제 코드...@Daointerface MainDAO {    ...    @Query("SELECT * FROM DayMealView")    suspend fun getAllDayMeals(): List    @Query("SELECT * FROM DayMealView LIMIT :limit")    suspend fun getAllDayMeals(limit: Int): List    @Query("""    SELECT * FROM DayMealView     WHERE day_date     @Query("SELECT * FROM DayMealView W..

[백준] 15829 (Hashing)

#1 알고리즘#1-1 직관적인 풀이와 그 한계#3-1에 있는 50점 짜리 코드는 누구나 생각할만한 직관적인 풀이다. 문제는, L이 큰 경우다. L이 큰 경우는 나머지 연산을 연산 중간 중간에 끼워서 수가 너무 커지지 않게 조절해야 한다. 하지만, 예를 들어 L이 30이라면 3130라는 엄청나게 큰 수를 계산해야하는데 이건 말이 안 된다. 따라서 이 문제는 #3-1에 있는 직관적인 풀이가 아닌 새로운 방식으로 풀어야 한다는 분위기를 풍긴다. 다행히, 문제의 힌트에서 무언가가 보인다. #1-2 힌트abcde의 해시 값은 1 × 310 + 2 × 311 + 3 × 312 + 4 × 313 + 5 × 314 = 1 + 62 + 2883 + 119164 + 4617605 = 4739715이다.반복되는 숫자가 눈에..

Nutri Capture 프론트엔드 - 무한 스크롤 로직 리팩토링

#1 문제#1-1 문제 상황정렬된 아이템이기에, 각 아이템의 시각은 위에서 아래로 갈수록 작아져야한다. 그러나, mealId 41인 아이템과 mealId 50인 아이템을 보면 이상한 점이 보인다. 바로 mealId 50인 아이템의 시각은 18:01:14...로, 17:09:03...인 mealId 50보다 큰 것이다. #1-2 문제 코드...@Composablefun NutrientScreen( ...) { LaunchedEffect(key1 = true) { ... } LaunchedEffect(key1 = true) { ... } LaunchedEffect(key1 = viewModel.isInitialized.value) { if..

Nutri Capture 백엔드 - Room 무결성 보완

#1 개요이전 게시글의 Commit은 앱 실행이 안되는 버그가 있다. 해당 버그를 발생시킨 근본적인 부분을 찾아간다. 특히, 세번째 에러는 Room의 무결성과 관련된 에러로 해결까지 꽤 시간이 소요됐으며, 동시에 Room 구현에 있어 DAO를 경솔히 작성해서는 안된다는 교훈을 내게 주었다. #2 코드 - 첫번째 에러#2-1 NoSuchElementExceptionFATAL EXCEPTION: main (Ask Gemini)Process: com.example.nutri_capture_new, PID: 7679java.util.NoSuchElementException: List is empty. at kotlin.collections.CollectionsKt___CollectionsKt.last(_C..

Nutri Capture 프론트엔드 - 채팅UI 구조 잡기

#1 개요이전 게시글에서 채팅 UI 도입을 위해 가상 테이블 DayMealView를 만들었다. 백엔드 작업이 끝났으므로, Day 테이블 및 Meal 테이블을 참조하던 프론트가 이제는 DayMealView 테이블을 참조하도록 만들어야 한다. #2 코드 - 백엔드 깨알 변경 사항#2-1 DAO에서 getAllDayMeals(limit: Int) 선언...@Daointerface MainDAO { ... @Query("SELECT * FROM DayMealView LIMIT :limit") suspend fun getAllDayMeals(limit: Int): List ...}존재하는 모든 레코드를 가져오는 getAllDayMeals()의 메소드 오버로딩이다. getAllDayMeals(..

[백준] 14940 (쉬운 최단거리)

#1 알고리즘#1-1 '최단 거리'의 의미이 문제에서 '최단 거리'란, '목표 지점(2)으로부터 한번 움직일 때마다 +1한 값'이다. 1차원에서는 간단하다. 검은색 선의 길이와 '최단 거리'가 비례하기 때문이다 (이미 방문한 지역은 다시 방문하지 않는다). 2차원이라면 문제가 복잡해진다. 선의 길이와 '최단 거리'가 비례하지 않는다. 2에서 1로 가는 빨간색 선은 '최단 거리'면서 동시에 '목표 지점(2)으로부터 한번 움직일 때마다 +1한 값'이다. 초록색 선은 '최단 거리'는 아니지만, 빨간색 선과 마찬가지로 '목표 지점(2)으로부터 한번 움직일 때마다 +1한 값'이다. 정리하면, 2차원에서 '최단 거리'는 반드시 '목표 지점(2)으로부터 한번 움직일 때마다 +1한 값'이지만, 역으로 '목표 지점(2)..