14501번 - 퇴사*

2022. 4. 2. 00:002022/BaekJoon_삼성 SW 역량 테스트 기출

동적계획법 (DP : Dynamic Programming)
큰 문제를 작은 문제로 나눠서 푸는 알고리즘
수행시간의 비약적 향상이 핵심으로 '메모이제이션'이라는 기법을 사용해 이미 계산된 결과는 별도의 메모리에 저장하여 필요한 경우 다시 계산하지 않고 다시 꺼내 사용하는 방식
  • Top-Down 방식 : 메모이제이션을 통한 재귀함수를 사용한 방식
  • Bottom-Up 방식 : 결과 저장용 리스트인 dp 테이블을 통해 반복문으로 문제를 해결
N = int(input())
T = []
P = []
dp = []
for _ in range(N):
    t, p = map(int, input().split())
    T.append(t)
    P.append(p)
    dp.append(p)
    
dp.append(0)

for i in range(N-1,-1,-1):
    if (T[i]-1)+(i+1) > N:
        # 아무것도 하지 않고, 이전 값(dp[i+1]) 그대로 가져옴
        dp[i] = dp[i+1]
    else:
        # 기존 상담 스케쥴(dp[i+1])과 현재 상담을 새로 가져온 스케쥴(P[i] + dp[i+T[i]]) 중에서 큰 값
        dp[i] = max(dp[i+1], P[i] + dp[i + T[i]])

print(dp[0])

 

* 뒤에서 부터 확인하면서 DP를 갱신한다. -> 상담날이 퇴사날을 초과하는 경우 기존 상담 스케쥴 유지

* 새로운 상담이 가능한 경우, 기존의 상담 스케쥴과 현재 상담+겹치지 않는 이전 상담 스케쥴 중에서 큰 값을 가져옴

'2022 > BaekJoon_삼성 SW 역량 테스트 기출' 카테고리의 다른 글

3190 - 뱀  (0) 2022.05.03
13460 - 구슬탈출2*  (0) 2022.05.03
12100 - 2048(Easy)*  (0) 2022.05.03
14888번 - 연산자 끼워넣기*  (0) 2022.04.08
13458번 - 시험 감독  (0) 2022.04.01