동적계획법(Dynamic Programming)
동적계획법에 대한 이해 피보나치 수열은 첫째항이 0, 둘째항이 1이고 이전 두항을 더해가며 새로운 항의 값을 구해나가는 수열이다. 0, 1, 1, 2, 3, 5, 8, 13 ... 과 같이 이어지며, 점화식은 다음과 같다. F(N) = F(N-1) + F(N-2) (N >= 2) F(0) = 0, F(1) = 1 N번째 항의 값을 구하는 문제는, N-1번째 항을 구하는 문제와 N-2번째 항을 구하는 문제로 나누어질 수 있다. 이렇게 큰 문제를 작은 문제로 나누어 풀 수 있는 경우를 최적 부분 구조(Optimal Structure) 라고 한다. 최적 부분 구조에 대해 자세히 말하면, 문제의 최적 해결 방법이 부분 문제에 대한 최적 해결 방법으로 구성되는 경우를 말한다. 최적 부분 구조를 가지는 피보나치 수..
2021. 11. 17.
Numpy 배열 생성하기와 형태 변형하기
Numpy numerical python, 행렬과 관련된 연산에 사용하는 python 라이브러리. python 리스트를 이용한 연산보다 빠르며, 메모리를 적게 차지한다. Numpy Tutorials Tip 💡 Numpy 실습은 jupyternotebook에서 하는 것이 가장 편리하다. 아직 jupyter를 설치하지 않은 분이 계시다면 jupyternotebook 배열 생성하기 np.array() 리스트 데이터를 활용하여 array를 생성할 수 있다. import numpy as np ary = np.array([[1, 2, 3], [4, 5, 6]]) ary output: array([[1, 2, 3], [4, 5, 6]]) np.asarray() np.array() 와 동일하게 array를 생성할 수 ..
2021. 10. 30.
[백준 2410번] 2의 멱수의 합 풀이
2410번: 2의 멱수의 합 첫째 줄에 경우의 수를 출력한다. 답이 커질 수 있으므로 1,000,000,000으로 나눈 나머지를 출력한다. www.acmicpc.net 입력으로 주어진 N을 2의 멱수(2^k) 의 조합으로 몇개나 나타낼 수 있는지 구하는 문제이다. 이는 다이나믹 프로그래밍 기법으로 해결할 수 있다. 수를 하나씩 늘려 가능한 2^k 조합을 구해보면, 다음과 같다. N=1 -> 1 N=2 -> 1+1, 2 N=3 -> 1+1+1, 2+1 N=4 -> 1+1+1+1, 2+1+1, 2+2, 4 N=5 -> 1+1+1+1+1, 2+1+1+1, 2+2+1, 4+1 ... N이 홀수일 경우를 살펴보면, N-1의 가능한 조합 끝에 1씩을 더해주어 완성된다. N=3 인 경우, N=2 일 때의 조합 (1+..
2021. 10. 20.
[백준 2251번] 물통 풀이
2251번: 물통 각각 부피가 A, B, C(1≤A, B, C≤200) 리터인 세 개의 물통이 있다. 처음에는 앞의 두 물통은 비어 있고, 세 번째 물통은 가득(C 리터) 차 있다. 이제 어떤 물통에 들어있는 물을 다른 물통으로 쏟아 부 www.acmicpc.net 담을 수 있는 부피가 각각 A, B, C 인 물통 3개가 있다. 초기에는 마지막 물통만 가득 차 있으며, 나머지 물통은 비어있다. 한 물통이 가득 차거나 빌 때까지 물을 옮기고, 이를 반복할 수 있다. 처음 물통에 들어있는 양이 0 일 때, 마지막 물통에 들어있을 수 있는 물의 양을 모두 구해야 한다. 가장 쉬운 방법은, 각 물통에 담길 수 있는 물의 양에 대해 모든 경우의 수를 탐색하고, 첫번째 물통이 비었다면 마지막 물통의 양을 저장하는 ..
2021. 10. 18.
[백준 1790번] 수 이어 쓰기 2 풀이
1790번: 수 이어 쓰기 2 첫째 줄에 N(1 ≤ N ≤ 100,000,000)과, k(1 ≤ k ≤ 1,000,000,000)가 주어진다. N과 k 사이에는 공백이 하나 이상 있다. www.acmicpc.net 1 부터 N까지의 수를 이어붙였을 때, K번쨰 자리에 있는 문자를 출력하는 문제이다. 먼저, K번째 자리에 있는 문자를 찾기 위하여 1번 부터 몇번까지의 수를 이어붙여야 하는지 찾아보자. 수의 특성에 따라, 1 ~ 9 까지의 수는 1자리 수들이고 9 * 10^0 = 9 개 이며, 9*10^0 * 1(문자의 자리수) = 9 개의 문자를 표현한다. 10 ~ 99 까지의 수는 2자리 수들이고 9 * 10^1 = 90 개 이며, 9*10^1 * 2(문자의 자리수) = 180 개의 문자를 표현한다. 1..
2021. 10. 13.