https://www.acmicpc.net/problem/16493
16493번: 최대 페이지 수
첫째 줄에 N(1 ≤ N ≤ 200)과 챕터의 수 M(1 ≤ M ≤ 20)이 주어진다. 둘째 줄부터 각 챕터 당 읽는데 소요되는 일 수와 페이지 수가 주어진다. 소요되는 일 수는 20보다 작거나 같은 자연수이고, 페이
www.acmicpc.net
| 2 초 | 512 MB | 1599 | 986 | 824 | 62.283% |
문제
철수는 한양대학교 도서관에서 책을 빌려놓고 까먹고 있다가 며칠 후 책을 반납해야 한다는 사실을 깨달았다. 남은 기간 동안 최대한 많은 페이지를 읽고 연체없이 반납하고 싶다.
빌린 책은 여러 챕터로 구성된 에세이집인데 챕터들은 서로 독립적이다. 즉, 어느 챕터를 읽기 위해 다른 챕터를 먼저 읽어야 할 필요가 없다. 철수는 중간에 관두는 것을 못견디는 성격이라, 한 챕터를 읽기 시작하면 끝까지 봐야한다.
남은 기간 N일과, 책의 각 챕터 당 그 챕터를 전부 읽는데 소요되는 일 수와 페이지 수가 주어질 때, N일간 읽을 수 있는 최대 페이지 수를 구하는 프로그램을 작성하라.
입력
첫째 줄에 N(1 ≤ N ≤ 200)과 챕터의 수 M(1 ≤ M ≤ 20)이 주어진다. 둘째 줄부터 각 챕터 당 읽는데 소요되는 일 수와 페이지 수가 주어진다. 소요되는 일 수는 20보다 작거나 같은 자연수이고, 페이지 수는 300보다 작거나 같은 자연수이다.
출력
읽을 수 있는 최대 페이지 수를 출력한다.

제출 코드
def readbook(idx, dy, pg):
global page
if dy <= N:
page = max(pg, page)
if dy > N:
return
if idx >= M:
return
readbook(idx + 1, dy + lst[idx][0], pg + lst[idx][1])
readbook(idx + 1, dy, pg)
# 남은기간N, 챕터의 수M
N, M = map(int, input().split())
lst = []
for _ in range(M):
d, p = map(int, input().split())
lst.append([d, p])
page = 0
readbook(0, 0, 0)
print(page)
기저함수를 뒤에 쓰는경우는 처음이라 좀 헤맸다.
재귀를 들어갈 때 다음 인덱스를 보면서 이전 인덱스 값을 더해서 이런 경우가 생기는거 같은데 좋은 경험을 했당
'알고리즘 > 백준' 카테고리의 다른 글
| [BOJ#2668] 숫자 고르기 (2) | 2024.04.04 |
|---|---|
| [BOJ#1759] 암호 만들기 (1) | 2024.04.03 |
| [BOJ#8979] 올림픽 (0) | 2024.03.30 |
| [BOJ#12789] 도키도키 간식드리미 (0) | 2024.03.30 |
| [BOJ#9934] 완전 이진 트리 (0) | 2024.03.27 |