코테/BOJ
백준 15486 [퇴사 2] 파이썬
동 캄
2025. 5. 27. 22:57
반응형
https://www.acmicpc.net/problem/14501
퇴사 1
https://www.acmicpc.net/problem/15486
퇴사 2
# 백준 15486 퇴사 2
import sys
from collections import defaultdict
# 상담 가능한 총 일 수 N 입력
N = int(sys.stdin.readline())
# 각 날짜마다 걸리는 상담 시간(T)과 받을 수 있는 금액(P) 저장
T = [] # 상담에 걸리는 일 수
P = [] # 상담 시 받을 수 있는 금액
# end_days[i]는 i일에 끝나는 상담들의 시작 인덱스를 저장
end_days = [[] for _ in range(N + 1)]
# dp[i]는 i일 기준으로 얻을 수 있는 최대 이익
dp = [0 for _ in range(N + 1)]
# 입력 받으면서, 상담이 기간 내에 끝날 수 있으면 end_days에 기록
for i in range(N):
st, c = map(int, sys.stdin.readline().split())
T.append(st)
P.append(c)
if T[i] + i < N + 1:
end_days[T[i] + i].append(i) # i번째 날 시작한 상담이 끝나는 날짜에 기록
# dp 배열 채우기
for i in range(N + 1):
# i일에 끝나는 상담들을 확인하며 최대 이익 갱신
for ind in end_days[i]:
if ind + T[ind] == i:
dp[i] = max(dp[i], dp[ind] + P[ind])
# 이전 날까지의 최대 이익이 더 클 경우 갱신 (상담을 하지 않는 경우)
if i >= 1 and dp[i] < dp[i - 1]:
dp[i] = dp[i - 1]
# 전체 기간 동안 얻을 수 있는 최대 수익 출력
print(max(dp))
퇴사1을 풀고나서 2도 같은 원리로 풀면되지 않을까 생각했는데, 그렇지 않았다. 시간 복잡도를 고려해야됐었다..
for문을 2번 도는것이 아니라, 현재 날짜(i번째 날)에 끝나는 상담을 배열에 넣어서, 그 경우만 고려하였다.
DP 갈 길이 멀다..
미--------------------------친 GPT
FOR문을 한 번만 썼다.
# GPT 코드
import sys
input = sys.stdin.readline # 빠른 입력을 위해 sys.stdin.readline 사용
# 총 상담 일수 N 입력
N = int(input())
# 상담 기간(T)과 수익(P)을 담을 리스트
T = []
P = []
# 각 날짜별 상담 기간과 수익 입력
for _ in range(N):
t, p = map(int, input().split())
T.append(t)
P.append(p)
# dp[i]는 i번째 날부터 마지막 날까지 얻을 수 있는 최대 수익
# N+2로 잡는 이유는 dp[N+1]까지 접근할 수 있도록 하기 위해 (종료일이 N+1일일 수 있음)
dp = [0] * (N + 2)
# N일부터 1일까지 거꾸로 계산
for day in range(N, 0, -1):
end_day = day + T[day - 1] # 오늘 시작하는 상담이 끝나는 날
if end_day <= N + 1:
# 오늘 상담을 하면 얻을 수 있는 수익 vs 오늘 상담을 하지 않고 다음 날로 넘긴 수익
dp[day] = max(P[day - 1] + dp[end_day], dp[day + 1])
else:
# 오늘 상담을 하면 퇴사일(N+1일)을 넘기므로 상담 불가 → 그냥 다음 날로 넘김
dp[day] = dp[day + 1]
# 1일부터 시작했을 때의 최대 수익 출력
print(dp[1])
반응형