일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 잡생각
- 영어공부
- 만화도
- 쓰릴오브파이트
- 스탭퍼
- Daily Challenge
- 미드시청
- 링피트
- 30분
- 리얼 클래스
- leetcode
- 운동
- realclass
- 개발자
- 뭐든
- 사이드
- Problem Solving
- English
- 괜찮음
- 10분
- 매일
- 화상영어
- 3줄정리
- 프로젝트
- Writing
- 파비최
- 읽기
- 영어원서읽기
- FIT XR
- 월간
- Today
- Total
파비의 매일매일 공부기록
5.8 철근 자르기 - 재귀 본문
철근이 길이에 따라 서로 다른 가격으로 판매될 때
특정 길이의 철근을 어떻게 잘라야 이익을 최대화할 수 있을지 구하는 문제다.
이 문제의 풀이도 동전 문제와 별반 다를 게 없다.
종료 조건은 남은 철근이 없을 때이며
반복문을 돌며 최대 이익을 구하도록 재귀 호출하면 된다.
위의 내용을 코드로 옮기면 다음과 같다.
import sys
sys.setrecursionlimit(10 ** 5)
def solve(v, n):
if n <= 0:
return 0
price = -987654321
for i in range(1, n + 1):
price = max(price, v[i] + solve(v, n - i))
return price
if __name__ == '__main__':
v = [0] + list(map(int, input().split()))
print(solve(v, len(v) - 1))
처음 소스 작성할 때
v와 n을 모두 입력받았는데 문제를 다시 보니 굳이 그럴 필요가 없어서 v 기준으로 n을 구해줌.
만약 v에 [0]을 추가해주지 않으려면 solve 쪽의 price 구하는 로직의 수정이 필요함. (+1로 해주면 됨)
소스와 개념은 정말 동전 문제와 유사한 패턴으로 보인다.
결국은 하위 문제의 반복이라고 할 수 있는데
예를 들어 n이 10인 경우(v의 엘리먼트가 10개)
n이 9인 경우의 최댓값 + v [1]과
n이 8인 경우의 최댓값 + v [2]과
n이 7인 경우의 최댓값 + v [3]과
n이 6인 경우의 최댓값 + v [4]과
n이 5인 경우의 최댓값 + v [5]과
n이 4인 경우의 최댓값 + v [6]과
n이 3인 경우의 최댓값 + v [7]과
n이 2인 경우의 최댓값 + v [8]과
n이 1인 경우의 최댓값 + v [9]과
n이 0인 경우의 최댓값(결국 0) + v [10] 중에 최댓값을 구하면 되는 문제가 된다.
여기서 핵심은 'n이 9인 경우의 최댓값'을 구하려면 다시
n이 8인 경우의 최댓값 + v [1]과
n이 7인 경우의 최댓값 + v [2]과
n이 6인 경우의 최댓값 + v [3]과
n이 5인 경우의 최댓값 + v [4]과
n이 4인 경우의 최댓값 + v [5]과
n이 3인 경우의 최댓값 + v [6]과
n이 2인 경우의 최댓값 + v [7]과
n이 1인 경우의 최댓값 + v [8]과
n이 0인 경우의 최댓값(결국 0) + v [9] 중에 최댓값을 구하면 되는 문제가 된다.
결국은 하위 문제의 반복이라고 볼 수 있다.
책에 위의 내용일 필요 할거 같은데.. 그냥 점화식만 딱 적어 놓고 끝 -_-;;
아마도 책 전반에서 설명한 내용이라 생략한 거 같긴 한데..
독자에게는 크게 도움이 안 될 것으로 보이기도 한다.
하긴 뭐 어차피 DP로 바꿔서 풀긴 할 테니;; 크게 상관없는 걸까?
'Study > Algorithm 문제풀이' 카테고리의 다른 글
5.8 철근 자르기 - DP (0) | 2021.09.20 |
---|---|
5.8 철근 자르기 - 메모전략 (0) | 2021.09.19 |
5.7 거스름돈 최적화 - DP (0) | 2021.09.17 |
5.7 거스름돈 최적화 - 재귀 (0) | 2021.09.16 |
5.6 최장 공통 부분 수열 출력하기 (0) | 2021.09.15 |