dynamic-programming

3 개의 포스트

kakao5분 읽기큐레이션 요약

2026 카카오그룹 신입크루 공채 코딩테스트 2차 문제해설

2026 카카오그룹 신입크루 2차 코딩테스트는 총 5문제로, 완전탐색부터 동적 계획법, 슬라이딩 윈도우, 수학적 관찰, 백트래킹까지 다양한 문제 해결 능력을 요구했다. 각 문제는 단순한 구현보다 상태를 효율적으로 표현하고, 불필요한 탐색을 줄이는 설계가 핵심이었다. 특히 입력 크기가 큰 문제에서는 배열을 직접 생성하지 않고 누적합이나 구간별 규칙을 활용해야 했다. ## 문제 1: 힌트 스테이지 — 구매 조합 완전탐색 - 각 스테이지에서 힌트 번들을 구매할지 여부를 비트마스크로 표현한다. - `mask`를 `0`부터 `2^n - 1`까지 순회하며 모든 구매 조합을 확인한다. - 특정 구매 조합이 정해지면: - 현재 스테이지에서 사용할 수 있는 힌트권을 최대한 사용한다. - 그때의 스테이지 해결 비용과 구매 비용을 합산한다. - 번들 구매 후 이후 스테이지에서 사용할 수 있는 힌트권 수를 갱신한다. - 모든 조합 중 총비용이 가장 작은 값을 답으로 선택한다. - 힌트권 수가 `n` 이상 증가할 수 있으므로 배열 인덱스 오버플로를 방지해야 한다. - 핵심 시간복잡도는 구매 여부를 전부 확인하는 완전탐색에 기반한다. ## 문제 2: 보물 찾기 — 구간 DP - 보물이 `L`열부터 `R`열 사이에 있을 때, 반드시 찾기 위한 최소 비용을 `cost[L][R]`로 정의한다. - 구간 안의 `i`열을 굴착하면 다음 세 경우를 고려해야 한다. - 보물이 `i`열에 있으면 추가 비용은 없다. - 보물이 왼쪽에 있으면 `cost[L][i-1]`가 추가된다. - 보물이 오른쪽에 있으면 `cost[i+1][R]`가 추가된다. - 따라서 `i`열을 선택했을 때 필요한 비용은 다음 세 값의 최댓값이다. - `depth[i]` - `depth[i] + cost[L][i-1]` - `depth[i] + cost[i+1][R]` - 이 최댓값을 최소화하는 `i`를 선택해 `cost[L][R]`와 `pick[L][R]`를 갱신한다. - `pick` 배열에는 각 구간에서 처음 굴착해야 할 열을 저장한다. - 이후 전체 구간 `[1, w]`에서 시작해 굴착 결과에 따라 왼쪽 또는 오른쪽 구간으로 범위를 좁힌다. - 열의 개수가 최대 200이므로 모든 구간과 후보 열을 확인하는 `O(w^3)` DP가 가능하다. - 단순히 항상 가운데 열을 고르는 전략은 각 열의 굴착 비용을 반영하지 못해 최적해를 보장하지 않는다. ## 문제 3: 선인장 숨기기 — 2차원 슬라이딩 윈도우 - 각 칸에 해당 칸이 몇 번째 빗방울에 젖는지를 기록한다. - 비를 한 번도 맞지 않는 칸은 `INF`로 설정한다. - `w × h` 부분격자 `W`가 처음 비를 맞는 시각은 내부 값의 최솟값이다. - `f(W) = W 내부 원소들의 최솟값` - 따라서 `f(W)`가 가장 큰 부분격자를 찾으면 된다. - 2차원 최솟값을 직접 반복 계산하지 않고, 단조 deque를 이용해 두 번의 1차원 슬라이딩 윈도우로 처리한다. - 각 행에서 너비 `w`의 최솟값을 계산한다. - 그 결과에 대해 각 열마다 높이 `h`의 최솟값을 계산한다. - 단조 deque에서는: - 새 값을 넣을 때 뒤에서 더 큰 값들을 제거한다. - 윈도우를 벗어난 인덱스는 앞에서 제거한다. - 각 원소가 deque에 최대 한 번 들어가고 한 번 나오므로 전체 시간복잡도는 `O(mn)`이다. - 최솟값이 같으면 더 위쪽, 다시 같으면 더 왼쪽에 있는 부분격자를 선택한다. - 추가 메모리도 `O(mn)`이며, `m × n ≤ 5 × 10^5` 조건을 처리할 수 있다. ## 문제 4: 제곱 개수 배열 — 누적합과 구간 점프 - `brr`는 `arr[i]` 값을 `arr[i]`번 연속해서 추가해 만든 배열이다. - `brr`의 길이가 최대 `10^15` 수준이 될 수 있어 실제 배열을 생성하면 안 된다. - `arr`의 누적합을 이용해 `brr`의 특정 인덱스가 어떤 동일 값 구간에 속하는지 찾는다. - `arr[i]^2`의 누적합도 만들어 여러 숫자 구간에 걸친 합을 빠르게 계산한다. ### 구간 합 K 계산 - `[l, r]` 구간은 최대 세 부분으로 나눈다. - `l`이 속한 구간의 남은 부분 - 완전히 포함되는 가운데 숫자 구간들 - `r`이 속한 구간의 앞부분 - 양 끝이 같은 숫자 구간에 속하면 값과 길이를 곱해 한 번에 계산할 수 있다. - 누적합을 이용해 각 부분을 `O(1)`에 계산한다. ### 합이 K인 윈도우 개수 C 계산 - `brr` 위에서 고정된 길이의 윈도우를 한 칸씩 이동시키면 일반적으로 배열 길이에 비례하는 시간이 걸린다. - 하지만 윈도우의 왼쪽 끝과 오른쪽 끝이 각각 같은 숫자 구간에 머무는 동안에는, 윈도우 합의 변화량이 일정하다. - 이 구간에서 윈도우 합은 등차수열이 되므로 합이 `K`인 시작점의 개수를 수식으로 한 번에 계산할 수 있다. - 숫자가 바뀌는 경계까지 점프한 뒤 같은 과정을 반복한다. - 숫자 구간의 경계를 기준으로 이동하므로 전체 시간복잡도는 `O(N)`이다. ## 문제 5: 기차 선로 — 백트래킹과 시뮬레이션 - 격자 크기가 최대 20칸으로 작아 가능한 선로 배치 수를 백트래킹으로 탐색할 수 있다. - 기차는 `(1, 1)`에서 출발해 현재 선로의 방향에 따라 한 칸씩 이동한다. - 빈칸을 만날 때마다 놓을 수 있는 모든 선로 종류를 시도한다. - 새 선로의 형태는 다음 두 정보에 의해 결정된다. - 직전에 어느 방향에서 들어왔는지 - 다음에 어느 방향으로 나갈지 - 따라서 현재 위치뿐 아니라 이전 이동 방향도 탐색 상태에 포함해야 한다. - 다음과 같은 경우에는 즉시 탐색을 중단한다. - 장애물로 이동하는 경우 - 현재 방향과 맞지 않는 선로를 만난 경우 - 격자 밖으로 나가는 경우 - 도착점 `(n, m)`에 도달하면 전체 조건을 검증한다. - 격자에 놓인 모든 선로를 기차가 지나갔는지 확인한다. - 3번 선로를 가로와 세로 방향으로 각각 한 번씩, 총 두 번 통과했는지 확인한다. - 모든 조건을 만족하는 경로만 정답 개수에 포함한다. - 경우의 수가 많지 않지만 상태와 선로 연결 조건을 정확히 구현하는 것이 가장 중요하다. 각 문제는 문제의 구조에 맞는 알고리즘 선택이 성능을 좌우한다. 작은 상태 공간에서는 완전탐색과 백트래킹을 사용하고, 구간 선택 문제는 DP로 상태를 저장하며, 대규모 배열 문제는 누적합·단조 deque·구간 점프처럼 반복 계산을 제거하는 기법을 적용하는 것이 효과적이다.

원문 읽기(새 탭에서 열림)
google원문

LLM 기반 여행 계획 최적화 (새 탭에서 열림)

대규모 언어 모델(LLM)은 사용자의 주관적인 취향과 정성적인 목표를 이해하는 데 탁월하지만, 개장 시간이나 이동 시간 같은 정량적인 제약 조건을 정밀하게 계산하는 데에는 한계가 있습니다. 이를 해결하기 위해 구글 리서치는 LLM이 초기 계획을 수립하고, 최적화 알고리즘이 실제 데이터를 기반으로 실행 가능성을 검증 및 조정하는 하이브리드 여행 계획 시스템을 개발했습니다. 이 시스템은 사용자의 의도를 최대한 반영하면서도 논리적으로 완벽한 일정을 생성하는 것을 목표로 합니다. **LLM과 최적화 알고리즘의 결합 구조** * 시스템은 먼저 제미나이(Gemini) 모델을 사용하여 사용자의 쿼리에 최적화된 초기 여행 계획을 생성하며, 여기에는 활동 목록, 권장 소요 시간, 중요도 등이 포함됩니다. * 생성된 초기 계획은 검색 백엔드를 통해 확보한 최신 영업시간 및 이동 시간 데이터와 결합되어 '그라운딩(Grounding)' 과정을 거칩니다. * LLM이 제안한 활동이 실행 불가능할 경우를 대비하여, 검색 시스템은 유사한 성격의 대체 활동들을 병렬적으로 추출하여 최적화 알고리즘에 전달합니다. **2단계 최적화 프로세스** * **일일 일정 최적화:** 첫 번째 단계에서는 개별 날짜 내의 활동 순서를 결정합니다. 동적 계획법(Dynamic Programming)을 활용하여 활동의 유사도와 실행 가능성을 점수화하며, 영업시간 미준수나 동선 오류가 있는 일정에는 0점을 부여하여 제외합니다. * **전체 일정 배분:** 두 번째 단계에서는 여러 날에 걸친 활동들이 겹치지 않도록 전체 경로를 구성합니다. 이는 컴퓨터 과학에서 '가중치 세트 패킹(Weighted Set Packing)' 문제로 분류되는 NP-완전(NP-complete) 문제로, 계산 복잡도가 매우 높습니다. * **지역 탐색 휴리스틱:** 복잡한 계산을 효율적으로 처리하기 위해 초기 일정에서 활동 위치를 조금씩 바꾸며 전체 점수를 높여가는 '지역 탐색 휴리스틱(Local search heuristics)'을 적용하여 최종 수렴된 최적의 일정을 도출합니다. **실제 적용 사례 및 효과** * **정성적 요구사항 충족:** "사람이 적고 덜 알려진 박물관"을 찾는 쿼리에서 일반 검색 시스템은 유명 박물관을 포함하는 오류를 범했으나, LLM 기반 시스템은 사용자의 의도를 정확히 파악하여 숨겨진 명소들로만 일정을 구성했습니다. * **물류적 실행 가능성 확보:** LLM이 샌프란시스코 여행 계획 시 도시를 가로지르는 비효율적인 동선을 제안하더라도, 최적화 알고리즘이 지리적 근접성을 고려하여 활동 순서를 재배치함으로써 현실적인 동선을 완성했습니다. 이러한 하이브리드 접근 방식은 AI의 유연한 이해 능력과 알고리즘의 엄격한 논리력을 결합하여 사용자에게 실질적으로 도움이 되는 도구를 제공합니다. 향후 이 기술은 여행 계획뿐만 아니라 복잡한 제약 조건이 얽힌 다양한 스케줄링 및 물류 최적화 분야에 광범위하게 활용될 수 있을 것으로 기대됩니다.

datadog원문

구간별 회귀: 하나의 직선만으로는 부족할 때 (새 탭에서 열림)

데이터독(Datadog)은 단일 선형 회귀로 설명하기 어려운 복잡한 시계열 데이터를 효과적으로 모델링하기 위해 자동화된 분절 회귀(Piecewise Regression) 알고리즘을 도입했습니다. 이 알고리즘은 수동 개입 없이 데이터의 추세가 변하는 분절점(Breakpoint)과 최적의 구간 개수를 스스로 찾아내며, 수많은 시계열 데이터를 초당 수백 건씩 처리할 수 있는 효율성을 갖추고 있습니다. 결과적으로 모델의 오차를 최소화하면서도 불필요하게 많은 구간을 생성하지 않는 균형 잡힌 데이터 해석을 가능하게 합니다. **자동화된 분절 회귀의 목표** * **분절점 및 구간 개수 자동 탐색:** 사람이 직접 추세가 변하는 지점을 지정할 수 없으므로, 알고리즘이 스스로 최적의 분절 위치와 데이터에 적합한 구간의 개수(1개부터 n개까지)를 결정해야 합니다. * **연속성 제약 배제:** 각 구간의 끝점과 다음 구간의 시작점이 반드시 연결되어야 한다는 제약을 두지 않음으로써 모델링의 유연성을 확보했습니다. * **확장성 확보:** 대규모 시계열 데이터 세트에서 실시간에 가까운 속도로 회귀 분석을 수행할 수 있어야 합니다. **최적 모델 탐색의 과제** * **탐색 공간의 복잡성:** 시계열을 구간으로 나누는 모든 경우의 수를 계산하는 것은 지수 함수적으로 비용이 증가하며, 동적 계획법(Dynamic Programming)조차 실무에서는 너무 느릴 수 있습니다. * **오차와 단순함의 균형:** 구간이 많아질수록 오차는 줄어들지만 과적합(Overfitting) 위험이 커지며, 구간이 너무 적으면 데이터의 유의미한 변화를 포착하지 못하는 상충 관계를 해결해야 합니다. **그리디(Greedy) 알고리즘 기반의 해결책** * **초기 상태 설정:** 먼저 전체 데이터 포인트($n$)를 $n/2$개의 아주 작은 구간으로 나누어 최소자승법(OLS) 회귀를 수행합니다. 이 단계는 오차는 거의 없지만 극도로 과적합된 상태에서 시작합니다. * **반복적 병합:** 인접한 두 구간을 하나로 합쳤을 때 전체 오차 증가량이 가장 적은 쌍을 찾아 하나로 병합합니다. 이 과정을 데이터가 단 하나의 구간이 될 때까지 반복합니다. * **상태 저장:** 병합 과정 중 특정 '중단 기준'을 만족하기 직전의 상태들을 기록해 두었다가, 최종적으로 가장 적절하다고 판단되는 시점의 모델을 선택합니다. **중단 기준(Stopping Criteria) 및 최적화** * **상대적 오차 증가량 감시:** 현재 병합으로 인한 오차 증가량이 이전의 어떤 병합보다도 클 때를 잠재적인 중단 시점으로 고려합니다. * **3% 임계값 적용:** 데이터가 원래 하나의 직선에 가까운 경우 너무 일찍 병합을 멈추는 것을 방지하기 위해, 병합으로 인한 오차 증가가 전체 단일 회귀 오차의 3% 미만일 때는 병합을 계속 진행하도록 설계되었습니다. * **최종 모델 선택:** 위 기준들을 바탕으로 급격한 오차 상승이 발생하기 직전, 즉 데이터의 특징을 가장 잘 설명하면서도 일반화된 상태의 구간 구조를 최종 결과물로 반환합니다. 이러한 탐욕적 병합 방식은 계산 복잡도를 낮추면서도 실무에서 신뢰할 수 있는 수준의 시계열 추세 분석을 제공하며, 특히 데이터의 급격한 변화나 패턴 전환을 자동으로 감지해야 하는 모니터링 시스템에 매우 적합합니다.