최적 부분 구조(Optimal Substructure)

최적 부분 구조(Optimal Substructure) 동적 계획법(Dynamic Programming)은 복잡한 문제를 더 작고 간단한 하위 문제로 나누어 해결하는 알고리즘 패러다임이다. 동적 계획법이 적용되기 위해서는 두 가지 핵심 특성이 필요하다: 중복되는 하위 문제(Overlapping Subproblems) 최적 부분 구조(Optimal Substructure) 이다. 최적 부분 구조는 효율적인 알고리즘 설계의 핵심 개념이다. 문제의 특성을 이해하고 최적 부분 구조를 식별할 수 있다면, 복잡한 문제도 동적 계획법이나 그리디 알고리즘을 통해 효율적으로 해결할 수 있다. 최적 부분 구조가 없는 문제는 다른 접근 방식(예: 분할 정복, 백트래킹)을 고려해야 한다. ...

January 22, 2025 · 16 min · Me

중복되는 하위 문제(Overlapping Subproblems)

중복되는 하위 문제(Overlapping Subproblems) 동적 계획법(Dynamic Programming)은 복잡한 문제를 더 작고 간단한 하위 문제로 나누어 해결하는 알고리즘 패러다임이다. 동적 계획법이 효과적으로 적용되기 위해서는 두 가지 핵심 특성이 필요하다: 최적 부분 구조(Optimal Substructure) 중복되는 하위 문제(Overlapping Subproblems) 이다. 중복되는 하위 문제(Overlapping Subproblems)의 기본 개념 중복되는 하위 문제는 동일한 하위 문제가 알고리즘 실행 과정에서 여러 번 반복해서 나타나는 특성을 말한다. 즉, 문제를 해결하는 과정에서 같은 계산이 여러 번 수행되는 경우이다. 중복되는 하위 문제가 있을 때 동적 계획법은 각 하위 문제의 결과를 저장(메모이제이션)하여 중복 계산을 피함으로써 효율성을 크게 향상시킨다. ...

January 21, 2025 · 16 min · Me

Dynamic Programming vs. Divide and Conquer

Divide and Conquer vs. Dynamic Programming “Divide and Conquer"와 “Dynamic Programming"은 모두 복잡한 문제를 더 작은 부분으로 나누어 해결하는 전략이지만, 접근 방식과 적용 상황에서 중요한 차이가 있다. 분할 정복은 문제를 독립적인 하위 문제로 나누어 효율성을 높이는 반면, 동적 계획법은 중복되는 하위 문제의 결과를 저장하여 재계산을 방지한다. 알고리즘 선택은 문제의 성격에 따라 달라져야 한다. 하위 문제 간 중복이 있는지, 최적 부분 구조가 있는지를 파악하여 적절한 알고리즘을 선택하는 것이 중요하다. Divide and Conquer(분할 정복) 알고리즘 분할 정복은 복잡한 문제를 더 작고 관리하기 쉬운 하위 문제들로 나누어 해결하는 방법이다. 이 알고리즘은 다음과 같은 세 단계로 구성된다: ...

December 9, 2024 · 6 min · Me

메모이제이션 (Memoization)

메모이제이션 (Memoization) 메모이제이션은 “기억하다"라는 뜻의 라틴어 ‘memorandum’에서 유래했다. 이 기법은 동일한 계산을 반복해야 할 때, 이전에 계산한 값을 메모리에 저장해두고 필요할 때 다시 계산하지 않고 저장된 값을 사용하는 방식이다. 실생활에 비유해보면, 책을 보다가 모르는 단어를 사전에서 찾았을 때 메모이제이션 미사용: 같은 단어가 나올 때마다 매번 사전을 찾음 메모이제이션 사용: 찾은 단어의 의미를 메모장에 적어두고, 다시 나오면 메모장을 참고 로 이해 가능하다. 메모이제이션의 작동 원리 함수가 호출될 때 입력값을 확인한다. 해당 입력값에 대한 결과가 이미 저장되어 있다면, 저장된 결과를 즉시 반환한다. 저장된 결과가 없다면, 함수를 실행하고 그 결과를 저장한 후 반환한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 def memoized_function(n, memo={}): # 1. 이미 계산된 값인지 확인 if n in memo: return memo[n] # 2. 새로운 값 계산 result = ... # 계산 로직 # 3. 계산된 값을 저장 memo[n] = result # 4. 결과 반환 return result 메모이제이션의 장점 실행 속도 향상: 중복 계산을 피함으로써 프로그램의 실행 속도를 크게 높일 수 있다. 자원 효율성: 계산 비용이 높은 작업의 결과를 재사용함으로써 컴퓨터 자원을 효율적으로 사용할 수 있다. 메모이제이션의 사용 예시 가장 대표적인 예시로 피보나치 수열 계산을 들 수 있다. 일반적인 재귀 함수로 구현하면 중복 계산이 많이 발생하지만, 메모이제이션을 적용하면 성능을 크게 개선할 수 있다. ...

October 13, 2024 · 3 min · Me

테이블레이션(Tabulation)

테이블레이션(Tabulation) Tabulation은 프로그래밍에서 동적 프로그래밍(Dynamic Programming)의 한 기법으로, 복잡한 문제를 해결하기 위해 사용되는 방법이다. Tabulation은 ‘표를 만든다’는 의미로, 문제의 해결 과정을 표 형태로 정리하는 기법이다. 이 방법은 작은 부분 문제(subproblem)부터 시작하여 점진적으로 더 큰 문제를 해결해 나가는 상향식(bottom-up) 접근 방식을 사용합니다. Tabulation의 작동 원리 문제 정의: 해결하고자 하는 문제와 그 부분 문제들을 명확히 정의한다. 표 초기화: 부분 문제의 결과를 저장할 표(보통 배열이나 리스트)를 만든다. 기본 케이스 설정: 가장 작은 부분 문제에 대한 해답을 표에 채운다. 반복적 계산: 작은 부분 문제부터 시작하여 큰 문제로 나아가며 표를 채운다. 최종 결과 도출: 표의 마지막 항목이 전체 문제의 해답이 된다. Tabulation의 예시: 피보나치 수열 피보나치 수열을 계산하는 예시 ...

October 13, 2024 · 2 min · Me