단조 큐를 이용한 동적 계획법 최적화 기법
단조 큐를 통한 동적 계획법 최적화 개요
단조 큐는 특정 조건 하에서 무의미한 후보를 빠르게 제거함으로써 상태 전이의 효율을 높이는 강력한 기법이다. 특히, 결정의 범위가 항상 증가하거나 감소하는 경우, 즉 윈도우 크기가 고정되거나 단조롭게 변할 때 효과적이다. 이는 일반적으로 슬라이딩 윈도우 문제로 모델링 가능하며, 대부분의 최적화 패턴은 이 구조에 근 ...
8월 5일 20:39에 게시됨
루고 P15440 문제 해설
루고 문제에 대한 제 해법입니다.
문제의 핵심은 신호등의 수가 2025개라는 점에서 출발하며, 이때 시간 복잡도가 O(n^2)보다 작은 동적 계획법(DP)을 고려해야 합니다.
각 조작 후 불이 켜진 횟수와 초기 상태 간의 차이를 상태로 설정하면 편리합니다. 첫 번째 조작 후 상태는 0으로 시작합니다. 여기서 dp[i][j]는 (i+1)번째 조작 후 상태 j를 가질 경우의 수를 나타냅 ...
8월 3일 16:20에 게시됨
트리 동적 계획법: 다지 트리 배낭 문제와 최대 경로 합
다지 트리 배낭 문제 (Multi-ary Tree Knapsack Problem)
이전에는 이진 트리를 기반으로 한 문제를 다루었지만, 이제는 난이도를 높여 다지 트리(multi-ary tree) 구조에 적용되는 동적 계획법(DP)을 살펴보겠습니다. 다지 트리는 각 노드가 여러 자식 노드를 가질 수 있는 형태입니다. 이 경우, 단순한 이진 트리 DP 방식으로는 해결하기 어렵습니다. 대신, 배낭 문제(kn ...
7월 28일 08:58에 게시됨
MX-S 모의고사 풀이 노트
T1: 메시지 필터링
문제 개요
총 n개의 채팅방을 순서대로 확인하며, 각 메시지에 bie 부분 문자열이 포함되어 있고 아직 전송한 적 없는 경우에만 전송한다. 전송할 메시지가 없는 채팅방은 특정 문구를 출력한다.
해결 방법
문자열 탐색과 중복 체크가 핵심이다. bie 존재 여부는 단순 순회로 확인하고, 중복 방지를 위해 해싱 기법을 활용한다. 더블 해싱을 적용해 충돌 ...
7월 26일 03:02에 게시됨
정수 배열에서 최대 부분 배열 합 찾기: 세 가지 접근 방식
정수 배열이 주어졌을 때, 그 안에서 연속된 부분 배열 중 합이 가장 큰 부분 배열을 찾아 그 합을 반환하는 것은 고전적인 알고리즘 문제입니다. 이 문제는 다양한 최적화 기법을 통해 해결할 수 있으며, 여기서는 세 가지 주요 접근 방식인 무차별 대입(Brute Force), 분할 정복(Divide and Conquer), 그리고 동적 계획법(Dynamic Programming)을 다룹니다. 특히, 대규모 ...
7월 13일 17:10에 게시됨
조합 수학과 구성 문제의 심화 분석
기본 조합 계수 문제
문제는 특정 조건을 만족하는 정점 집합의 개수를 세는 것으로, 주로 그래프 구조와 조합적 성질을 활용한다. 예를 들어, 트리에서 두 하위 트리의 크기가 k/2인 경우를 찾는 것은 이진 분할 기반의 조합 계산으로 해결 가능하다. 각 간선에 대해 양쪽 끝점이 모두 "좋은 점"일 확률을 계산하고, 이를 전체 가능한 선택지 중에서 비율로 표현하면 된다 ...
7월 13일 03:26에 게시됨
LeetCode 동적 계획법 문제 해결 전략
동적 계획법 핵심 개념
동적 계획법은 중복 하위 문제가 많은 최적화 문제에 효과적입니다. 문제를 하위 문제로 분해하고, 동일 계산을 반복하지 않도록 결과를 저장합니다. 최적 부분 구조가 존재해야 적용 가능하며, 이는 지역 최적해가 전역 최적해로 이어지는 구조를 의미합니다. 핵심은 상위 문제 해결에 하위 문제의 결과가 재사용되는 점입니다.
대표적인 예로 피 ...
7월 9일 21:30에 게시됨
LeetCode 문제 풀이: 31번부터 60번까지
다음 순열
정수 배열의 순열은 모든 요소를 일렬로 나열한 것을 의미합니다. 주어진 정수 배열에서 사전순으로 다음에 오는 더 큰 순열을 찾아야 합니다. 만약 더 큰 순열이 없다면, 배열을 가장 작은 순서로 재배치해야 합니다.
#include <vector>
#include <algorithm>
class Solution {
public:
void nextPermutation(std::vector<int>& n ...
7월 8일 05:51에 게시됨
CSP2019 Day2T2 분할 최적화
기본적인 동적계획법 접근은 dp[i][j]를 마지막 분할 지점이 i, 이전 분할 지점이 j일 때의 최소 비용으로 정의한다. 누적합을 sum[i] = Σk=1i a[k]로 두면, 전이식은 다음과 같다:
dp[i][j] = min{ dp[j][k] + (sum[i] - sum[j])² }
( sum[i] - sum[j] ≥ sum[j] - sum[k] )
조건를 정리하면 sum[k] ≥ 2×sum[j] - sum[i]가 되며, 고정된 j에 대해 i가 증가함에 따라 하한 ...
7월 7일 02:24에 게시됨
최장 증가 부분 수열의 응용 문제와 해결 전략
교차하지 않는 다리 건설 문제
강의 양안에 위치한 도시들을 연결하는 다리를 건설할 때 교차하지 않도록 최대 다리 수를 구하는 문제입니다. 하안 도시를 배열 인덱스로, 상안 도시 번호를 값으로 매핑하면 최장 증가 부분 수열(LIS) 문제로 변환됩니다. 도시 쌍을 정렬한 후 LIS 길이를 계산합니다.
#include <iostream>
#include <algorithm>
using namesp ...
7월 3일 03:26에 게시됨