일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 스택
- 자바스크립트
- 문자열
- DFS
- 자료구조
- 구현
- 그래프 탐색
- programmers
- 파이썬
- 그래프 이론
- 딕셔너리
- 그래프이론
- 웹 프론트엔드
- BASIC
- JavaScript
- lv2
- 프로그래머스스쿨
- web
- 알고리즘
- 백준
- 너비 우선 탐색
- 정렬
- 브루트포스 알고리즘
- 다이나믹 프로그래밍
- BFS
- level2
- DP
- 프로그래머스
- CSS
- 그리디 알고리즘
- Today
- Total
DevLog:-)
[알고리즘][파이썬]14501-퇴사 본문
문제
1. 초기 풀이
import sys
N = int(sys.stdin.readline())
li = [list(map(int,sys.stdin.readline().strip().split())) for _ in range(N)]
s =[0]
for i in range(N-1,-1,-1):
S = li[i][0]
M = li[i][1]
MAX = M
if(i+S-1)>=N:
li[i][1] = -1
continue
for j in range(i+S,N): #해당 일자의 상담기간 이후 기간을 for문으로 돌면서 최대 금액을 찾는다.
if(li[j][1] != -1 ):
MAX = max(MAX, M + li[j][1])
li[i][1] = MAX #각 일자별 최대 금액으로 list를 갱신한다.
s.append(li[i][1])
print(max(s))
초반 풀이에서는 DP를 사용하지 않고 풀었다.
각 일자별로 최대의 수입을 기재해 놓고 모든 일자 중에 최댓값을 출력하게 코드를 작성했다.
각 일자별 최대수입은 s 리스트를 따로 선언해서 append후 max() 함수를 사용했다.
😅발생한 오류
s에 0으로 초기화하지 않아 N =1일 경우의 런타임에러(ValueError)이 발생했다.
ValuError은 잘못된 값이 들어갔을 때 발생하는 오류 이다.
N =1일 경우 s가 빈리스트인채로 max() 함수에 들어가게 돼서 오류가 발생한 것이다.
다양한 반례를 고려해서 초기화에 주의를 해야할 것 같다.
이 문제를 dp를 이용하여 풀이하면 더 간단한 코드를 구현할 수 있다.
2.DP 풀이
import sys
N = int(sys.stdin.readline())
li = [list(map(int,sys.stdin.readline().strip().split())) for _ in range(N)]
dp = [0 for _ in range(N+1)]
for i in range(N-1, -1, -1):
if i + li[i][0] > N: # 상담에 필요한 일수가 퇴사일을 넘기면
dp[i] = dp[i+1] # 다음날 값을 가져온다.
else:
dp[i] = max(dp[i+1], dp[i + li[i][0]] + li[i][1]) # 오늘 상담을 안 할 경우와 상담을 할 경우 중 max 값
print(dp[0])
❗처음에 dp 배열을 선언해 줄 때 N+1크기로 선언해 주는 것을 주의해야 한다.
상담에 필요한 일수가 퇴사일을 넘기는 경우 다음날의 값을 가져오도록 코드를 구현했는데
마지막날(N번째)이 이에 해당한다면 가상의 다음날(N+1)이 필요하기 때문이다.
DP
-다이나믹 프로그래밍(동적 계획)
-하나의 큰 문제를 여러 개의 작은 문제로 나누어서 그 결과를 저장하여 다시 큰 문제를 해결할 때 사용
-큰 문제를 작은 문제로 쪼개서 그 답을 저장해 두고 재활용
+또 다른 DP문제👍
[알고리즘][파이썬]1149-RGB거리
문제 코드 import sys n = int(sys.stdin.readline()) R=[] for i in range(n): r,g,b = map(int,sys.stdin.readline().strip().split()) #strip왼쪽 공백 제거 if(i==0): RGB=[r,g,b] continue RGB = [min(RGB[1], RGB[2]) + r, min(RGB[0], RGB[2]) + g, min(RGB[
developer-gaeppu.tistory.com
'알고리즘 > 백준' 카테고리의 다른 글
[알고리즘][파이썬]2839-설탕 배달 (0) | 2023.07.17 |
---|---|
[알고리즘][파이썬]2579-계단오르기 (0) | 2023.07.13 |
[알고리즘][파이썬]1302-베스트 셀러 (0) | 2023.07.10 |
[알고리즘][파이썬]2443-별찍기 -6 (0) | 2023.07.08 |
[알고리즘][파이썬]1463-1로 만들기 (BFS/DP) (0) | 2023.07.05 |