기록하고 까먹지 말기

9465 본문

전공/백준

9465

yha97 2023. 10. 9. 14:47

날짜 : 2023. 10. 09

사용 언어 : python

 

문제

https://www.acmicpc.net/problem/9465

 

 

코드

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개였지만 헷갈리지 않도록 조심해야겠다.

 

 

참고 사이트

 

'전공 > 백준' 카테고리의 다른 글

2096  (0) 2023.10.17
7662  (0) 2023.10.10
6198  (0) 2023.10.08
15666  (0) 2023.09.30
2877  (0) 2023.09.30