공부의 참맛을 느껴가는 중... 아 기분 좋다 진짜 ..🤸♀️
해당 문제는 현재 한국 코테 바이블 이코테에 수록되어 있는 문제인데 대학 다니면서 처음 코딩테스트에 대해 접한 초반에 풀어보고 진짜 이해가 도통 되지 않아 좌절했던 문제다.
풀이가 이해된 뒤에도 뒤에서부터 인덱스를 접근해야만 이 문제를 풀 수 있나..? 싶어서 계속 의아했었는데
드디어 내 사고방식에 근거해서 이 문제를 풀 수 있었다.
n = int(input())
T = []
P = []
total = [0] * (n+1)
for i in range(n):
time, price = map(int, input().split())
T.append(time)
P.append(price)
for i in range(n):
if i > 0:
total[i] = max(total[i-1], total[i])
if i+T[i] <= n and total[i+T[i]] < total[i] + P[i]:
total[i+T[i]] = total[i] + P[i]
print(max(total))
정말 놓치지 말아야하는 포인트는 예제 1,2에서는 퐁당퐁당으로 결과가 쭉 이어지지만,
예제 3, 4 같은 경우는 해당 시점의 dp테이블보다 그 전의 dp테이블값이 큰 경우를 고려해야한다는 것이다.
그러니까 내가 서있는(검사하는) 그 시점의 dp테이블을 시작값이라고 볼 때(이미 전부터 갱신되어온), 그 과거 dp테이블 중 최신값인 내 바로 이전 값(검사 시작 전)을 검사해주며 더 큰 값을 초기값으로 봐야한다는 것이다.
그걸 i-1 과 i 의 관계식만으로 비교 가능한가 ? 스스로 의심했는데. 사실 for문을 순서대로 돌며 차례차례 업뎃해왔으므로 바로 전 값을 가장 max값이라고 여기고 바로 접근하는게 이상하지 않다.
개인적으로 너무 까다로운 문제다.. 내 이해방식에 잘 들어맞지 않아 고생이다..
이게 제일 중요한건데! 급여 문제잖아 이건..;;
해당 유형 관련해서 회의실 예약, 뭐 예약 등등 자주 쓰이는 알고리즘이니까 확실히 익혀둘 필요가 있다.
이거 응용 문제도 있는데 걔도 풀어봐야 확실히 구조가 잡힐 것 같다.
'CodingTest > Baekjun Online Judge' 카테고리의 다른 글
[ BOJ / 파이썬 ] 6603. 로또 (0) | 2023.02.13 |
---|---|
[ BOJ / 파이썬 ] 6593. 상범빌딩 (0) | 2023.02.13 |
[ BOJ / 파이썬 ] 9461. 파도반 수열 (0) | 2023.02.06 |
[ BOJ / 파이썬 ] 코테. 증가하는 부분 수열(LIS) 문제 시리즈 (0) | 2023.02.06 |
[ BOJ / 파이썬 ] 2193. 이친수 (0) | 2023.02.05 |