이 문제를 푸는데 정말 오래걸렸고, 끝내 풀지 못했다.
해당 문제는 https://suri78.tistory.com/178것을 보고 받아적고, 이해하기 위해 블로그 글로 남긴다.
우선 for i in range(n):을 통해 0~n-1까지 반복문을 실행한다.
if i + data[i][0] > n: ->만약 해당 날짜가 n보다 작으면 실행한다.
우선 이부분도 쉽게 생각하지 못했다..
i는 해당 일수이고, data[i][0]을 통해 해당 날짜에서 그 날짜처리를 할 수 있는지 판별을 저 한 구문으로 하였다.
또한 charge[i] = 0,, 이 부분도 전혀 생각하지 못했다. 이 생각을 하기 어려웠던 이유는 당장 필요한 부분이기 보다 뒤에 상황까지 고려해준 부분이기 때문이다. 이 설명은 뒤에서 한번 더 하겠다.
t = charge[i] -> 해당 일을 처리할 수 있는 상황이라면 t = charge[i]를 통해 해당 날짜에 대한 금액을 가져온다. 이 금액은 단순히 그날에 해당하는 부분이 아니라 뒤에서 처리해준 값이다.
여기서 말하는 뒤에서 처리해준 값이란, 이 전까지 처리할 수 있었던 금액들도 다 포함이 된 것이라는 말이다.
(사실 이부분도 생각하지 못했다..이런 생각 어떻게 하는거지,,)
for j in ranage(i+data[i][0], n): -> 가능한 날짜로 판별된 i+data[i][0]부터~n까지 차례대로 해당 날짜에 대해 계산하는 것이다.
이 부분에서 날짜가 n이 넘어가는것도 판별해야하지 않나?! 그냥 charge에 날짜 값이 넘어가도 집어넣어도 되는건가?! 하는 생각이 들었다..
하지만 여기서 아까 말한 charge[i]=0부분이 쓰인다.. 어차피 그냥 charge에 날짜 값이 넘어가더라도, 그 값을 집어넣으면 위에 써놓은 저 구문이 해당 값이 날짜를 초과한다면 0으로 만들어주기 때문에,,,전혀 문제가 없어진다.
if t+data[j][1] > charge[j]: -> charge[j]는 해당 날짜까지의 최대값을 구해놓은 것이다. t+data[j][1]가 그 값보다 크다면 바꿔주는 것이다.
이렇게 해당 날짜를 사용하였을 때, 최대값을 구해줄 수 있다.
이 상태에서 max를 통해 최대 값을 구하는 것이다.
파이썬 몰랐던 문법
data = [tuple(map(int, input().split())) for _ in range(n)]
이렇게 list대신에 tuple을 사용하면 [(1,2), (3, 4)]식으로 배열안에 튜플이 생긴다.
charge = list(map(lambda x: x[1], data))
map(함수, 리스트)
리스트로 부터 원소를 하나씩 꺼내서 함수에 적용한 다음, 그 결과를 새로운 리스트에 담아주는 것이다.
>>> map(lambda x: x ** 2, range(5)) # 파이썬 2 [0, 1, 4, 9, 16] >>> list(map(lambda x: x ** 2, range(5))) # 파이썬 2 및 파이썬 3 [0, 1, 4, 9, 16]
'개발 > 알고리즘' 카테고리의 다른 글
[BOJ] 스티커_9465 (0) | 2021.01.20 |
---|---|
[BOJ] 01타일_1904 (0) | 2021.01.19 |
[python] 문자열 다루기 (0) | 2021.01.14 |
[BOJ] 연속합_1912 (0) | 2021.01.13 |
[BOJ] 포도주 시식_2156 (0) | 2021.01.12 |