본문 바로가기

전체 글

(30)
[백준] 1006번 습격자 초라기 문제 위치 : https://www.acmicpc.net/problem/1006 1. Approach (1) 다이나믹 프로그래밍으로 접근한다. -> 영역별로 묶을 수 있는 (최대 2개) 영역들을 표시해나가면서 경우에 따라 재귀함수를 호출하면서 메모이제이션 한다. 영역의 상태는 아래와 같이 가정하였고 prev, last가 이 상태를 나타낸다. 0 -> not used 1 -> inner used 2 -> outer used 3 -> both used 위 상태를 정의하면서 상황에 맞게 따라나가면서 문제를 풀어나가는 방식이다. (2) DP 배열 정의 -> DP[idx][prev][last] : idx까지 이전 블록의 상태가 prev 이고 마지막 블록 n - 1 상태가 last 일 때 까지의 최소 초라기 수 (..
[백준] 11568번 민균이의 계략 문제 위치 : https://www.acmicpc.net/problem/11568 1. Approach (1) LIS( Longest Increasing Sequence) 로 접근한다. -> LIS는 다이나믹 프로그래밍 문제 중에서도 대표적인 문제이자, 많이 사용되는 풀이 방법 중 하나이므로 정확히 이해하고 지나가는 것을 권장한다. 아래 링크에서 LIS 풀이 방법을 확인 할 수 있다. https://blog.naver.com/lgh121546/221872278258 (2) DP 배열 정의 -> DP[idx] : idx까지 가장 긴 최장 증가 수열 2. Source Code #include #include #include #define MAXLEN 1000 using namespace std; /* 문제 ..
[백준] 4781번 사탕 가게 문제 주소 : https://www.acmicpc.net/problem/4781 1. Approach (1) 다이나믹 프로그래밍으로 접근한다. -> 이유는 사탕의 종류가 최대 5000개, 소유한 돈 100원, 사탕이 개당 0.01원 이라면 i) 현재 사탕을 선택하는 경우 ii) 현재 노드를 선택하지 않는 경우 -> 1번 사탕을 선택하고 다음 차례에 1번 사탕을 다시 선택할 수 있으므로, 중복을 포함한 5000개의 사탕을 총 10000번 선택하게 되면 시간초과가 발생하게 된다. (2) DP 배열 정의 -> DP[money] : 돈 money로 살 수 있는 사탕의 최대 칼로리 (3) 돈을 소수점 둘째자리까지 받으므로, 100을 곱해서 int형으로 바꾼다음 문제를 풀어나간다. 2. Source Code #in..
[백준] 2213번 트리의 독립집합 문제 주소 : https://www.acmicpc.net/problem/2213 1. Approach (1) 다이나믹 프로그래밍으로 접근한다. ( 동작 방식을 같이 생각해야지 시간 초과의 여부를 알 수 있다 ) -> 이유는 트리의 노드가 최대 10,000개 이므로, i) 현재 노드를 선택하는 경우 -> 간선으로 이어져 있는 노드는 선택할 수 없다. ii) 현재 노드를 선택하지 않는 경우 -> 간선으로 이어져 있는 노드를 선택하지 않는 경우, 이어져 있는 노드를 선택하는 경우로 나뉜다. 총 3가지이고, 간단하게 모든 노드 10,000 개에 대해서 위 연산을 실행한다면, 약 3^10000 번의 연산을 하게 될 수가 있다. 즉, 시간 초과가 발생한다. (2) DP 배열 정의 -> DP[idx][2] : idx..
[백준] 9095번 1,2,3 더하기 문제 주소 : https://www.acmicpc.net/problem/9095 1. Approach (1) 다이나믹 프로그래밍으로 접근한다. -> 이유는 ( 3^10​ + 3^9 + ... + 3^1) 의 계산을 하게 되면, 시간 초과가 발생한다. (2) 동작 방식 ​ - num을 n부터 1, 2, 3으로 빼면서 함수를 실행시켜나간다. - 0에 도착하는 경우의 모든 수를 세야 한다. - num - 1, num - 2, num - 3을 하는 경우가 있으므로 이 3 경우를 전부 합쳐주면 된다. ​ (3) 다이나믹 프로그래밍은 대부분 결과 출력값 = 메모이제이션 테이블 = 함수반환 값이다. 즉, 재귀 함수를 호출할 때 넘겨주는 그 매개변수 값이 함수(num - 1)의 의미는 num - 1의 숫자를 1, 2,..
[백준] 1463번 1로 만들기 출처 : https://www.acmicpc.net/problem/1463 1. Approach (1) 다이나믹 프로그래밍으로 접근한다. -> 이유는 메모이제이션을 하지 않는다면, Top-down 방식 (재귀함수)로 풀었을 때 n / 3, n / 2, n - 1로 3 경우의 모든 경우를 다해본다면 N이 10^6 일 때 (3^10)^6의 시간이 걸릴 수가 있다. ​ (2) 다이나믹 프로그래밍을 처음 접하신 분들이라면 이 문제를 통해서 메모이제이션의 필요성, 동작 방식을 정확히 이해했으면 한다. ​ (3) 아래 그림은 n이 10일 때 함수 동작 방식에 대한 설명이다. -> 위 그래프에서 10부터 1까지의 간선의 개수가 연산 횟수와 같다. 2. Source Code #include #include #inclu..