읽기 전
- 불필요한 코드나 잘못 작성된 내용에 대한 지적은 언제나 환영합니다.
- 개인적으로 배운 점을 정리한 글입니다.
문제 링크
문제 풀이
직선에서의 똑같은 문제는 막힘없이 풀었는데 원형이 되자마자 막혀버렸다. 첫 집을 방문하면 이전 집(마지막 집)은 방문하면 안된다는 사실을 알아야 한다. 즉, 마지막 값을 방문하려면 첫 집을 방문하지 않아야 함을 의미하므로 dp 배열을 두 개 생성해야 한다.
- 주어진 집의 개수만큼의 dp 배열 생성
- 첫 집은 무조건 방문하는 경우 0, 1번 index 값 설정, 첫 집을 방문하지 않는 경우 0, 1번 index 설정
- 이후 2부터 N - 1까지 i번째 항은 i - 2까지의 최대값과 i번째 집을 더한 값, i - 1까지의 최대값을 비교하여 더 큰값으로 설정한다.
- dp 배열의 최대값들을 비교해 다른 값 리턴
python 코드
def solution(money):
N = len(money)
dp1 = [0] * N
dp2 = [0] * N
dp1[0], dp1[1] = money[0], max(money[0], money[1])
dp2[0], dp2[1] = 0, money[1]
for i in range(2, N):
if i == N - 1:
dp1[i] = max(dp1[i - 2], dp1[i - 1])
dp2[i] = max(dp2[i - 2] + money[i], dp2[i - 2])
continue
dp1[i] = max(dp1[i - 2] + money[i], dp1[i - 1])
dp2[i] = max(dp2[i - 2] + money[i], dp2[i - 1])
return max(max(dp1), max(dp2))
'Algorithms > Programmers' 카테고리의 다른 글
Programmers. N으로 표현 (0) | 2021.08.10 |
---|---|
Programmers. 다리를 지나는 트럭 (0) | 2021.08.10 |
Programmers. 등굣길 (0) | 2021.08.10 |
Programmers. 소수 찾기 (0) | 2021.08.10 |
Programmers. 큰 수 만들기 (0) | 2021.07.22 |