다이나믹 프로그래밍

[Python]알고리즘/이코테 2021

[다이나믹 프로그래밍] ▲ 문제4 - 효율적인 화폐 구성(226p)

[이코테] 문제4 - 효율적인 화폐 구성(226p) (한줄평) 점화식은 잘 세웠으나 책의 풀이가 더 간결하고 좋았던 문제로 한번쯤 복습이 필요한 문제! 풀이 시간: 40분 이내 1) 문제 해결 아이디어 이 문제는 그리디 거스름돈 문제와 거의 동일하지만 화폐단위의 큰 단위가 작은 단위의 배수가 아니기 때문에 무조건 큰 단위부터 거슬러주면 안된다!! 금액 1부터 m까지 만들수 있는 최소한의 화폐 개수를 찾아 d에 입력하면 된다. 아래의 점화식을 n개의 화폐 단위에 대하여 차례로 적용하면 된다. 각 금액을 만들 수 있는 최소 화폐 개수를 담는 리스트(d)를 (m + 1)의 크기로 10001로 초기화하여 생성한다. Q. dp테이블을 10001로 초기화하는 이유는? 화폐의 가치는 10,000보다 작은 자연수이고 ..

[Python]알고리즘/이코테 2021

[다이나믹 프로그래밍] ▲ 문제3 - 바닥 공사(223p)

[이코테] 문제3 - 바닥 공사(223p) (한줄평) 코드는 짧으나 점화식을 떠올리기가 쉽지 않았던 문제로 복습이 꼭 필요!! 풀이 시간: 30분 이내 1) 문제 해결 아이디어 가로 길이: n, 세로 길이: 2 인 직사각형 바닥을 1*2, 2*1, 2*2 3가지 타일로 채울 수 있는 경우의 수를 구하는 문제다. 이 문제 또한 다이나믹 프로그래밍의 기초 예제에서 빠질 수 없는 타일링 문제 유형이다. 왼쪽부터 타일을 채운다고 했을 때 아래와 같이 2가지 경우로 나눠볼 수 있다. 1. i - 1까지 이미 채워져있다면, i번째를 채우기 위해 사용할 수 있는 타일은 (2 * 1) 1가지 경우다. 2. i - 2까지 이미 채워져있다면, i - 1 ~ i 번째를 채우기 위해 사용할 수 있는 타일은 (1*2) 2개, ..

[Python]알고리즘/이코테 2021

[다이나믹 프로그래밍] ▲ 문제2 - 개미 전사(220p)

[이코테] 문제2 - 개미 전사(220p) (한줄평) 다이나믹 프로그래밍을 풀어야함을 알고 점화식을 도출해낼 수있는 능력을 요구하는 문제로 복습이 꼭 필요한 문제! (풀이1) 내 풍이 풀이 시간: 30분 이내 1) 문제 해결 아이디어 처음에 내가 생각해냈던 아이디어는 창고 최대 개수인 100개 크기로 생성한 리스트(d)에 해당 번호의 창고를 털었을 때 얻을 수 있는 식량의 최댓값을 기록하는 것이었다. 사실 예제로는 답이 맞게 나오는데 정확히 맞는 코드인지는 모르겠다.... 2) 소스코드 n = int(input()) # 창고 개수 graph = list(map(int, input().split())) # n개의 식량 개수 d = [0] * 100 d[0], d[1] = graph[0], graph[1] ..

[Python]알고리즘/이코테 2021

[다이나믹 프로그래밍] ▲ 문제1 - 1로 만들기(217p)

[이코테] 문제1 - 1로 만들기(217p) (한줄평) 평소였으면 최소값을 구하는 문제니 BFS로 해결 했을테지만 전형적인 다이나믹 프로그래밍 문제! 추후 복습이 꼭 필요한 문제 풀이 시간: 40분 이내 1) 문제 해결 아이디어 정수 x가 주어졌을 때, 연산 4개를 적절히 사용해 1을 만드는데 사용되는 연산의 최솟값을 구하는 문제다. a. x가 5로 나누어 떨어지면, 5로 나눈다 b. x가 3으로 나누어 떨어지면, 3으로 나눈다 c. x가 2로 나누어 떨어지면, 2로 나눈ㄴ다 d. x에서 1을 뺀다 1. 최적 부분 구조 큰 문제를 작은 문제로 나눌 수 있으며 작은 문제의 답을 모아서 큰 문제 해결O 2. 중복되는 부분 문제 동일한 작은문제를 반복적으로 해결해야 함 Q. 이 문제를 다이나믹 프로그래밍으로 ..

[Python]알고리즘/이코테 2021

[다이나믹 프로그래밍] 예제1 - 피보나치 수열

[이코테] 예제1 - 피보나치 수열 (한줄평) 다이나믹 프로그래밍의 대표적인 예제로 어렵지 않게 풀 수 있는 문제 (풀이1) 단순 재귀 풀이 시간: 1분 이내 1) 문제 해결 아이디어 단순 재귀 함수로 구현했을 때 시간복잡도는 O(2**n)이다. 이미 계산한 것에 대해 호출할 때마다 또 계산을 하기 때문에 n이 커질수록 수행 시간이 기하급수적으로 늘어나는 문제가 있다. 예를 들어, f(6)을 호출할 때 f(3)이 3번이나 호출된다. f(100)이라면 어마어마한 연산을 수행하는데 수백억년이 넘어간다. 2) 소스코드 # 1. 피보나치 수열(단순 재귀) def fibo(x): if x == 1 or x == 2: return 1 return fibo(x - 1) + fibo(x - 2) print(fibo(4..