2024/10 17

그리디 알고리즘 (Greedy Algorithm)

#1 알고리즘#1-1 개요while(정답 도출) { 현 시점 가장 좋아 보이는 선택}눈 앞의 이익만 추구(= Greedy(탐욕스러운, 욕심 많은))하는 방식의 접근법을 말한다. 위 코드의 형식을 갖추기만 하면 그리디 알고리즘이라 부를 수 있다. 즉 구체성이 낮은, 추상적인 알고리즘이다. #1-2 최적해(最適解, optimal solution)주어진 문제를 가장 효과적으로 해결하는 최상의 답 또는 해결 방법을 의미한다. #1-3 Yes/No 문제와 최적화 문제예를 들어, "어떤 조건 A를 만족하는 원소 B가 집합 C에 존재하는가?"라고 묻는 문제를 Yes/No 문제라고 한다. 반면 "어떤 조건 A를 만족하는 원소 B의 최솟ㆍ최댓값은 얼마인가?"라고 묻는 문제 즉, "최적해는 얼마인가?"라고 묻는 문제..

[백준] 1931 (회의실 배정)

#1 알고리즘#1-1 그리디 알고리즘 그리디 알고리즘 (Greedy Algorithm)#1 알고리즘#1-1 개요while(정답 도출) { 현 시점 가장 좋아 보이는 선택}눈 앞의 이익만 추구(= Greedy(탐욕스러운, 욕심 많은))하는 방식의 접근법을 말한다. 어떤 구체성을 띄지 않는, 굉장히 추상적kenel.tistory.com #1-2 최적해가장 많은 회의 갯수가 최적해다. 딱 봐도 정렬을 요구하는 문제다. 회의를 시작 시각 기준으로 정렬하면 문제가 동적 프로그래밍 문제가 된다. 반면, 종료 시각을 기준으로 정렬하면 문제가 그리디 알고리즘 문제가 된다. 전자의 접근이 틀렸다고는 볼 수 없지만 시간 초과로 인해 문제 풀이가 불가능하다. 따라서 종료 시각을 기준으로 정렬해야 한다. 또, 일반적으로 그리..

[백준] 1149 (RGB거리)

#1 알고리즘#1-1 동적 프로그래밍 동적 프로그래밍 (Dynamic Programming), 상향식(Bottom-up) 및 하향식(Top-down) 접근#1 알고리즘#1-1 정의동적 프로그래밍을 한 줄 요약하면 중복의 제거다. 정적(static)이라는 개념과 반대되는 개념으로서, 동적(dynamic)이라는 단어가 이름에 붙었다. 확실히 static이 붙을 만한 작업kenel.tistory.com상향식 동적 프로그래밍을 이용해 풀었다. #1-2 색깔 조건약간 어렵게 쓰여있는 것 같지만, "모든 지붕은 그 직전 지붕과 색이 달라야 한다"라는 말로 압축된다. 현재 순회중인 지붕의 색과는 다른 색의 지붕을 재귀 호출하는 방식으로 색깔 조건을 구현할 수 있겠다. #1-3 캐싱 객체의 구조와 재귀 호출 가지치기말..

Nutri Capture 백엔드 - View에서 INSERT 트리거

#1 개요지금까지의 과정을 통해, ViewModel에서 Model을 참조할 수 있게 되었다. 본 게시글에선 ViewModel에서 Model을 참조하는 이벤트를 구현하고, View에서 해당 이벤트를 Trigger하게 만들어본다. #2 코드#2-1 ViewModel의 이벤트 구현...class NutrientViewModel(private val repository: MainRepository) : ViewModel() {    ...    // (4) View로부터 받은 이벤트 처리    fun onEvent(event: NutrientViewModelEvent) {        when (event) {            ...            is NutrientViewModelEvent.Inse..

Nutri Capture 백엔드 - Model을 ViewModel에 생성자 주입

#1 개요이전 게시글에서 구축한 Room을 ViewModel에 생성자 주입하여, Room(Model)을 참조할 수 있게 만든다. #2 코드 - 이벤트 추가#2-1 이벤트 추가// package com.example.nutri_capture_new.nutrientimport com.example.nutri_capture_new.db.Mealimport java.time.LocalDatesealed class NutrientViewModelEvent { data object InitializeState : NutrientViewModelEvent() data object LoadMoreItemsAfterLastDate : NutrientViewModelEvent() data object Lo..

Nutri Capture 백엔드 - Room의 @DAO, @Database 구현

#1 개요이전 게시글에 이어, Room의 남은 부분을 구현한다. #2 코드#2-1 @DAO// package com.example.nutri_capture_new.dbimport androidx.room.Daoimport androidx.room.Deleteimport androidx.room.Insertimport androidx.room.OnConflictStrategyimport androidx.room.Queryimport java.time.LocalDate@Daointerface MainDAO { @Query("SELECT day_id FROM day_table WHERE day_date = :date LIMIT 1") suspend fun getDayId(date: LocalDate..

Nutri Capture 백엔드 - 새 ERD와 Room의 @Entity 정의

#1 개요#1-1 이전 게시글 폐기ERD에 대해 다뤘던 이전 게시글은 앱의 방향성을 재고한 이 게시글과 상충된다. 따라서 이전에 만들었던 ERD대로 데이터베이스의 스키마를 형성하지 않을 것이다. 새 ERD는 아래와 같다. #1-2 새 ERDmeal_table과 nutrition_info_table이 1 : n 관계인 것처럼 되어있는데 실제로는 그렇지 않다. nutrition_info_table은 meal_table의 기본키를 외래키이자 기본키로 쓰는, 식별 관계의 자식 테이블이기 때문에 1 : 1 관계다. 위 ERD 이미지는 DBeaver를 통해 뽑아낸 것인데 아마 오류가 난 것 같다. 아니면 1..n라는 표기가 1 : 1과 1 : n을 모두 아우르는 표현식일까? 아무튼 그렇다.-- Day 테이블CREA..

디베이터 - 논증

#1 개요논증은 논제에 대한 (찬성 혹은 반대한다는) 증명이다. 이 논증이 얼마나 짜임새있느냐에 따라 발언자의 말에 힘이 실린다. 따라서, 논증의 구조를 잘 파악하고 스킬을 갈고 닦아야 한다. 논제가 토론이라는 건물의 기둥이라면, 논증은 건물을 이루는 벽돌이다. 승리하기 위해선, 부실 공사 없이 벽돌 하나하나 쌓아올려가야 하는 것이다. #2 핵심 논리#2-1 진실... 나는 데브라(저자의 동료)와의 설전을 돌이켜봤다. 당시 내 상황이 꼭 우리 시대의 모습을 그대로 보여주는 것만 같았다. 자신이 진실이라 믿는 걸 고집스레 붙들고 있으면서도 설득력 있는 논거는 부족한 모습을. 진실이 시험대에 오르고 쉽사리 모호해지는 순간에는 절대 그 진실 자체의 지배력에 의지해서는 안 된다. 이런 시대일수록 단순히 진실을 ..

책/자기 계발 2024.10.17

Nutri Capture 프론트엔드 - Card

#1 개요스크롤 관련해서는 한시름 놓았다. 본 게시글에선 LazyColumn의 각 아이템을 Card로 감싸고 약간의 디자인적 수정을 할 것이다. 본 게시글까지해서 프론트엔드는 중간 맺음을 할 것이고 다음 게시글부터는 아마 백엔드 구현으로 넘어갈듯 싶다. #2 코드#2-1 (틀 잡기) Card()... @Composable fun NutrientScreen( ... ) { LaunchedEffect(key1 = true) { // State 초기화 ... // ViewModel로부터 받은 이벤트 처리 ... } LaunchedEffect(key1 = viewModel.isInitialized.value) { ... } LazyColumn( ... ) { val dailyMeals = viewModel.nu..