백준 9465 스티커 (실버 1)
링크: 9465 스티커
접근 방법
- 위 또는 아래 또는 선택하지 않음을 선택하고 다음 칸으로 넘어간다고 생각하면 dp로 풀 수 있을 것 같음
소스 코드
소스 코드: dp 풀이 정답 소스 코드
import sys
input = sys.stdin.readline
T = int(input())
for t in range(T):
n = int(input())
score = []
for _ in range(2):
score.append(list(map(int, input().split())))
dp = [[0 for _ in range(n+1)] for _ in range(2)]
for i in range(1, n+1):
dp[0][i] = max(dp[1][i-1] + score[0][i-1], dp[0][i-1])
dp[1][i] = max(dp[0][i-1] + score[1][i-1], dp[1][i-1])
print(max(dp[0][n], dp[1][n]))
코드 개선 사항(GPT 4o)
# 전
dp = [[0 for _ in range(n+1)] for _ in range(2)]
# 후
dp = [[0 for _ in range(n)] for _ in range(2)]
- 배열 크기를 n+1로 할 필요 없음(이전에 작성하던 문제풀이 방식을 이어 생각하다보니 헷갈린듯)
# 전
score = []
for _ in range(2):
score.append(list(map(int, input().split())))
# 후
score = [list(map(int, input().split())) for _ in range(2)]
- 더 직관적이고 깔끔하게 코드 바꾸기
- 사실 이 방법을 생각하다가 구현하지 못해서 사용하지 못한 방식
dp = [[0] * n for _ in range(2)]
- 이 방식도 가능하다.
결론
- dp 인 것을 바로 알아차렸고, 문제를 쉽게 풀 수 있었다.
- 이 문제는 슬라이싱 윈도우 방식으로도 풀 수 있어서 dp 리스트를 사용하지 않고도 풀 수 있다.
- 계속 이상함을 느낀 부분이 바로 이부분 이었는 듯
728x90
반응형
'개발 노트 > 알고리즘 문제' 카테고리의 다른 글
백준 7562 나이트의 이동 (실버 1) (0) | 2025.05.04 |
---|---|
백준 1759 암호 만들기 (0) | 2025.04.29 |
백준 10162 전자레인지 (브론즈 3) (0) | 2025.04.27 |
백준 11660 구간 합 구하기 5 (실버 1) (0) | 2025.04.22 |
백준 2468 안전 영역 (실버 1) (0) | 2025.04.21 |