반응형
동적 계획법(Dynamic Programming)
동적계획법이란 복잡한 문제를 간단한 여러개의 문제로 나눠푸는 방법을 말합니다. 이것은 부분 문제반복과 최적 부분 구조를 가지고 있는 알고리즘을 일반적인 방법에 비해 더욱 적은 시간 내에 풀 때 사용합니다.
재귀 알고리즘과 비슷해보이지만 결과를 매번 기록하여 연산을 중복하지 않기에 속도가 더 빠릅니다.
1. 퇴사
https://www.acmicpc.net/problem/14501
"""
dp(n번째 날, 여태까지 번 돈)
-> 근무를 한다면 dp(n + t, 여태까지번돈, + n번쨰날에 번돈)
-> 근무를 안한다면 dp(n + 1, 여태까지번돈)
"""
n = int(input())
lst = []
for _ in range(n):
# 소요일수, 돈
a, b = map(int, input().split())
lst.append((a, b))
# lst = [(3, 10), (5, 20), (1, 10), (1, 20), (2, 15), (4, 40), (2, 200)]
max_pay = 0
def dp(idx, pay):
global max_pay
if idx >= n:
if pay > max_pay:
max_pay = pay
return
t, p = lst[idx]
for i in range(2):
if i == 1:
if idx + t > n:
return
dp(idx + t, pay + p)
else:
dp(idx + 1, pay)
dp(0, 0)
print(max_pay)
2. Maximum Subarray
https://leetcode.com/problems/maximum-subarray/
전형적인 DP문제로 이전 원소까지의 합이 0보다 크다면 다음 값에 이전값을 더해서 갱신하는 방법입니다.
직관적으로 풀이가 이해가 되지않았고 처음에 이 풀이를 봤을 때 '이렇게 하면 답이 나온다고?' 라고 의심했습니다.
사실 아직까지도 잘 이해가 가지 않습니다.
아마 이렇게 풀이를 하는 이유는 단순히 subarray의 최대합을 구하기 때문에 이렇게 짧게 나올 수 있지 않았나 생각해봅니다.
class Solution:
def maxSubArray(self, nums):
for i in range(1, len(nums)):
if nums[i - 1] > 0:
nums[i] += nums[i - 1]
return max(nums)
반응형
'부트캠프' 카테고리의 다른 글
[WIL] 실전 프로젝트 1주차 (0) | 2022.05.09 |
---|---|
[WIL] Middleware, N+1 문제 정리 및 해결 (0) | 2022.04.25 |
[알고리즘 3주차] WIL - 힙, 정렬(버블, 선택, 삽입, 퀵, 머지, 힙) (0) | 2022.04.03 |
[23일차] TIL 이진 탐색(Binary Search) - (1) (0) | 2022.04.01 |
[22일차] TIL - Week3 Test (0) | 2022.03.31 |