diff --git a/workbook_7319/silver/14501-s3.py b/workbook_7319/silver/14501-s3.py new file mode 100644 index 0000000..436e655 --- /dev/null +++ b/workbook_7319/silver/14501-s3.py @@ -0,0 +1,40 @@ +# 퇴사 + +import sys + +input = sys.stdin.readline + +def solution(): + n = int(input().rstrip()) + + t_p = [(0, 0)] + [tuple(map(int, input().rstrip().split())) for _ in range(n)] + [(0, 0)] + dp = [0] * (n+2) + + for i in range(1, n+2): + dp[i] = t_p[i][1] + for j in range(i-1, 0, -1): + if j+t_p[j][0] > i: + continue + dp[i] = max(dp[i], dp[j]+t_p[i][1]) + + print(dp[n+1]) + + return + + +solution() + +""" +걸린 시간: 29분 + +시간 복잡도: 현재 보는 날짜에서 이전 날짜까지를 다 확인해보기 때문에 O(n^2)이다. + +해설: 현재 보는 날짜로 올 수 있는 이전의 날짜들만 확인하고 싶었는데, set이나 dict에 계속 저장해놓고 갱신하는 것도 시간이 들기 때문에 +그냥 이전 날짜를 다 보고 현재 날짜로 올 수 있는 날짜들만 계산을 했다. + +근데 이걸 dp를 거꾸로 채우면 O(n)으로 가능하다. +현재 보는 날짜에 상담 여부를 결정하는데, 전제 조건은 현재 날짜에서 상담을 진행하면 퇴사날짜를 넘기지 않는 것이 조건이다. +만약 넘긴다면 그냥 dp[i+1]의 값을 가져와서 오늘은 상담을 안한 것으로 간주한다. +만약 퇴사 날짜를 넘기지 않는다면, max(dp[i+1], p[i]+dp[i+t[i]])로 +오늘 상담을 했을 경우 끝나는 미래 시점의 값에 오늘 상담 값을 더한 것과 그냥 오늘 상담을 안했을 때 값을 비교하여 최대값을 계산한다. +""" \ No newline at end of file