문제 : https://www.acmicpc.net/problem/11053 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net 해당 문제는 수열 A 가 주어졌을때, 가장 긴 증가하는 부분 수열, LIS (Longest Increasing Subsequence) 의 길이를 구하는 문제이다. 다이나믹 프로그래밍에서 가장 중요한 것은 규칙을 찾거나, 일반식을 찾는 것이다. 먼저, arr[1] < arr[2] 이므로 dp[2] = dp[1] ..
문제 : https://www.acmicpc.net/problem/1003 1003번: 피보나치 함수 각 테스트 케이스마다 0이 출력되는 횟수와 1이 출력되는 횟수를 공백으로 구분해서 출력한다. www.acmicpc.net 해당 문제는 피보나치 수열 중 하나를 호출하는 데에 필요한 피보나치(0) 과 피보나치 (1) 함수의 호출횟수를 카운트하는 문제이다. 이러한 문제는 전에 풀어본 유형인 다이나믹 프로그래밍으로, 5까지만 호출횟수를 세어도 DP 유형임을 파악할 수 있다. 다이나믹 프로그래밍에 관한 포스팅은 이전 포스팅인 "9095번 : 1,2,3 더하기 " 문제에서 자세히 다루었으니 참고하면 된다. https://codingjust.tistory.com/21 import java.io.BufferedRea..
다이나믹 프로그래밍 (DP) 해당 문제의 알고리즘을 확인해보면 '다이나믹 프로그래밍' 이라고 되어 있다. 이는 동적 계획법이라고도 불리며, 하나의 큰 문제를 여러 개의 작은 문제로 나누어서 그 결과를 저장하여 다시 큰 문제를 해결할 때 사용하는 것으로 특정한 알고리즘이 아닌 하나의 문제해결 패러다임으로 볼 수 있다. 이는 큰 문제를 작은 문제로 쪼개서, 그 답을 저장해두고 재활용하는 방식으로 자주 쓰인다. (기억해가면서 풀기) DP를 쓰는 이유 일반적인 재귀 방식 또한 DP와 매우 유사하다. 하지만 둘의 큰 차이점은 일반적인 재귀를 단순히 사용 시 동일한 작은 문제들이 여러 번 반복 되어 비효율적인 계산될 수 있다는 것이다. 예를 들어 피보나치 수열을 살펴보자. 피보나치 수열은 다음과 같다. 1, 1, ..