본문 바로가기

백준

백준 15486 이진수 덧셈(파이썬)

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

 

15486번: 퇴사 2

첫째 줄에 N (1 ≤ N ≤ 1,500,000)이 주어진다. 둘째 줄부터 N개의 줄에 Ti와 Pi가 공백으로 구분되어서 주어지며, 1일부터 N일까지 순서대로 주어진다. (1 ≤ Ti ≤ 50, 1 ≤ Pi ≤ 1,000)

www.acmicpc.net

 

풀이

모든 경우를 고려했을때 최댓값을 구하라는 것 문제의 요구사항에 따라서 DP문제임을 알 수 있다.

나는 특정일에 얻을 수 있는 최대 이익을 구하는데 집중을 하였다.

먼저 특정일에 주어진 일을 기간안에 완수할수 있는지 없는지를 확인하여야 한다.

그렇기에 특정 일에 주어진 일을 마무리 할 수 있는 날을 구한다. 

fin_date = idx + T[idx] - 1

이후 만약 마무리 할 수 있는 일의 마감 기한이 입력값 N보다 작다면 특정 일에 주어진 일을 완수해서 받을 수 있는 값과 특정 일을 하지 않았을때 받을수 있는 가격을 서로 비교한다.

dp[fin_date] = max(dp[fin_date], dp[idx-1] + P[idx])

그러나 이렇게만 코드를 작성한다면 마무리 할 수 있는 일의 마감 기한이 입력값 N보다 큰 값들에 대해서는 초기값을 업데이트 하지 못할것이다. 그렇기에 다음과 같은 코드를 추가하여 현재의 dp값과 전날의 dp값을 서로 비교해서 업데이트 해준다.

일종의 초기화 같은 역할을 한다.

dp[idx] = max(dp[idx], dp[idx-1])

코드

import sys

input = lambda: sys.stdin.readline().rstrip()

N = int(input())
T, P = [0 for _ in range(N+1)], [0 for _ in range(N+1)]
dp =  [0 for _ in range(N+1)]

for idx in range(1, N+1):
    T[idx], P[idx] = map(int, input().split(" "))

for idx in range(1, N+1):
    dp[idx] = max(dp[idx], dp[idx-1])
    fin_date = idx + T[idx] - 1
    if fin_date <= N:
        dp[fin_date] = max(dp[fin_date], dp[idx-1] + P[idx])

print(max(dp))

배열의 끝부분을 다루는 코드와 range를 통해서 idx를 다루는 것이 미숙한 듯 하다.

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

백준 1030 프렉탈 평면 (파이썬)  (0) 2023.08.04
백준 16938 캠프 준비(파이썬)  (0) 2023.07.11
백준 2812 크게 만들기 (파이썬)  (0) 2023.07.06
백준 4358 생태학 (파이썬)  (0) 2023.06.24
백준 14620 꽃길 (파이썬)  (0) 2023.06.24