백준 14501. 퇴사

2024. 10. 23. 17:25·백준

https://www.acmicpc.net/problem/14501

 

1. DP 탑다운 - 1

n = int(input())
arr = [list(map(int,input().split())) for _ in range(n)]

# T(걸리는 기간), P(수익)

dp = [-1] * (n+1) # 0일부터 n일까지 얻을 수 있는 최대 수익 저장 테이블

# f함수는 idx(현재 날짜)부터 얻을 수 있는 최대 수익을 반환하는 함수
def f(idx):
    if idx >= n:  # 현재 날짜가 퇴사 날짜를 넘으면 더 이상 상담할 수 없으므로 0 반환
        return 0

    if dp[idx] != -1:  # 이미 저장되었다면 -> 중복계산 방지
        return dp[idx]

    # 상담을 받는 경우와 안 받는 경우를 비교해서 최댓값을 dp에 저장!
    if idx + arr[idx][0] <= n:  # 상담이 퇴사일을 넘기지 않는 경우에만 상담 가능
        dp[idx] = max(f(idx + arr[idx][0]) + arr[idx][1], f(idx + 1))
    else:  # 상담을 퇴사일까지 끝낼 수 없는 경우 -> 상담 안 받고 넘어감
        dp[idx] = f(idx + 1)

    return dp[idx]

print(f(0))

2. DP 탑다운 - 2

import sys
input = sys.stdin.readline()
n = int(input())

arr = [list(map(int,input().split())) for _ in range(n)]

dp = [0] * (n+1)

for i in range(n-1, -1, -1):
    # i일에 상담하는 것이 퇴사일을 넘기면 상담 x
    if i + arr[i][0] > n:
        dp[i] = dp[i+1]
    else:
        # i일에 상담(i일의 수익 + i일에 상담 후의 최대수익) vs i일에 상담 안함(i+1일의 수익) 중 최댓값
        dp[i] = max(arr[i][1]+dp[i+arr[i][0]], dp[i+1])

print(dp[0]) # 0일부터 얻을 수 있는 최대수익 출력

3-1. DP 바텀업( 바텀업 방식은 작은 문제부터 차례대로 해결해 나가면서 더 큰 문제를 해결하는 방식!)

# 특정 날의 상담을 선택하면 그 상담이 끝나는 날 이후에 얻을 수 있는 수익을 
# 그 전까지의 수익과 비교해 최댓값을 갱신하는 방식

import sys
input = sys.stdin.readline()
n = int(input())

arr = [list(map(int,input().split())) for _ in range(n)] # ?일까지의 최대 수익 기록

dp = [0] * (n+1)

for i in range(n):  # i는 현재 상담을 고려할 날짜
    for j in range(i + arr[i][0], n + 1):  # i날에 상담을 진행했을 때, 그 상담이 끝나는 시점(j)
        if dp[j] < dp[i] + arr[i][1]:  # i번째 상담을 했을 때의 수익이 더 크다면 갱신
            dp[j] = dp[i] + arr[i][1]  # 더 큰 수익으로 dp[j] 갱신

print(dp[-1]) # n일(퇴사일)까지의 최대 수익

3-2. DP 바텀업

N = int(input())
arr = [[] for _ in range(N)]
for i in range(N):
    a, b = map(int, input().split())
    arr[i] = [a, b]

dp = [0 for _ in range(N+1)] # N+1인 이유는 퇴사 이후 수익(0)도 고려해야 하기 때문!

for idx in range(N)[::-1]: # 마지막 날부터 첫번째 날까지 거슬러 올라감(N-1, N-2, ...0)
    if idx + arr[idx][0] > N : # 일을 퇴사일 전에 끝낼 수 없다면 상담을 할 수 없음 -> 그 전 날의 보상을 유지
        dp[idx] = dp[idx + 1]
    else : # 상담이 가능한 경우, 상담을 받는 경우와 받지 않는 경우 비교해서 최댓값 저장
        dp[idx] = max(dp[idx + arr[idx][0]] + arr[idx][1], dp[idx + 1])

print(dp[0]) # 첫날부터 최대한 얻을 수 있는 수익을 뜻함
저작자표시 (새창열림)

'백준' 카테고리의 다른 글

백준 11053. 가장 증가하는 부분 수열  (0) 2024.10.26
백준 1937. 욕심쟁이 판다  (0) 2024.10.24
백준 12865. 평범한 배낭  (0) 2024.10.23
백준 2961. 도영이가 만든 맛있는 음식  (0) 2024.10.20
백준 2503. 숫자 야구  (0) 2024.10.20
'백준' 카테고리의 다른 글
  • 백준 11053. 가장 증가하는 부분 수열
  • 백준 1937. 욕심쟁이 판다
  • 백준 12865. 평범한 배낭
  • 백준 2961. 도영이가 만든 맛있는 음식
버그잡는고양이발
버그잡는고양이발
주니어 개발자입니다!
  • 버그잡는고양이발
    지극히평범한개발블로그
    버그잡는고양이발
  • 전체
    오늘
    어제
    • 분류 전체보기 (383) N
      • React (16)
      • Next.js (5)
      • Javascript (5)
      • Typescript (4)
      • Node.js (2)
      • Cs (16)
      • 트러블 슈팅&리팩토링 (6) N
      • Html (1)
      • Css (3)
      • Django (0)
      • vue (0)
      • Java (2)
      • Python (0)
      • 독서 (1)
      • 기타 (3)
      • 백준 (192)
      • swea (31)
      • 프로그래머스 (30)
      • 이코테 (4)
      • 99클럽 코테 스터디 (30)
      • ssafy (31)
      • IT기사 (1)
  • 블로그 메뉴

    • 홈
    • 태그
  • 인기 글

  • 태그

    개발자취업
    코딩테스트준비
    99클럽
    Til
    항해99
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
버그잡는고양이발
백준 14501. 퇴사
상단으로

티스토리툴바