Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 브루트포스
- MST
- DFS
- 재귀
- 백트래킹
- 그리디
- 시뮬레이션
- 다시
- 우선순위큐
- 다이나믹프로그래밍
- 분할정복
- 그래프 탐색
- BFS
- 구현
- 그래프 이론
- GROUP BY
- 수학
- 플로이드-워셜
- 투포인터
- 누적합
- DP
- 다이나믹 프로그래밍
- 크루스칼
- 서브쿼리
- join
- 자료구조
- 다익스트라
- 에라토스테네스의 체
- 해시
- 트리
Archives
- Today
- Total
기록하고 까먹지 말기
9465 본문
날짜 : 2023. 10. 09
사용 언어 : python
문제
코드
import sys
t = int(sys.stdin.readline()) # 테스트케이스
def solution():
n = int(sys.stdin.readline())
graph = list()
for _ in range(2):
graph.append(list(map(int, sys.stdin.readline().split()))) # 그래프 입력
if n == 1: return max(graph[0][0], graph[1][0])
dp = [[0] * n for _ in range(2)]
# 초기값 세팅
dp[0][0], dp[1][0] = graph[0][0], graph[1][0]
dp[0][1], dp[1][1] = graph[0][1] + graph[1][0], graph[1][1] + graph[0][0]
if n == 2: return max(dp[0][1], dp[1][1])
for i in range(2, n):
# 현재 위치의 값 + (대각선 vs 기울어진 대각선)
dp[0][i] = graph[0][i] + max(dp[1][i - 1], dp[1][i - 2])
dp[1][i] = graph[1][i] + max(dp[0][i - 1], dp[0][i - 2])
# for tmp in dp:
# print(tmp)
# print()
return max(dp[0][-1], dp[1][-1]) # 가장 마지막에서 max 리턴
for _ in range(t):
print(solution())
풀이
- 전형적인 DP 방식으로 풀이할 수 있는 문제였다.
- 스티커를 떼어내면 인접한 변을 갖는 위치의 값은 더할 수 없다.
- 그러므로 현재 위치가 (0, j)라고 가정한다면 영향을 미칠 수 있는 위치는 (1, j-1) 혹은 (1, j-2)가 된다.
* row의 인덱스가 1인 경우에는 1과 0을 각각 바꿔준다.
- 다만 해당 메모이제이션은 n의 크기가 2보다 클 때부터 가능하기 때문에 n이 각각 1, 2인 케이스는 조건문을 통해 리턴하여 오류를 피한다.
알게된 점
- 대각선으로만 접근하는 것을 인지했고 풀이 로직은 틀리지 않았지만 마지막 부분에서 n이 2일때의 케이스를 잘못적는 바람에 오답이 나왔었다.
- 해당 부분을 수정하니 바로 정답처리가 되었다.
- row 총 개수가 2개였지만 헷갈리지 않도록 조심해야겠다.
참고 사이트
-