문제
9465번: 스티커
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가 주어지며, 각 정수는 그 위치에 해당하는 스티커의
www.acmicpc.net
알고리즘
- 반복문을 통해 각 스티커 인덱스의 최댓값을 구한다.
- 카드의 크기가 2일 때인 즉, 인덱스가 1일 때 최댓값은 이전 대각선의 스티커 점수의 합이다.
- 인덱스가 1보다 클 경우에는 두칸 전에 스티커 값과 이전 스티커 값 중에서 큰 값과 현재 스티커의 값을 더한 값이 최댓값이 된다.
- 표를 통해 확인하면 더 쉽게 이해할 수 있다.
예제 입력 1)
index | 0 | 1 | 2 | 3 | 4 |
0 | 50 | 10 + 30 = 40 | max(100, 30) + 100 = 200 | max(120, 100) + 20 = 140 | max(210, 120) + 40 = 250 |
1 | 30 | 50 + 50 = 100 | max(40, 50) + 70 = 120 | max(200, 40) + 10 = 210 | max(140, 200) + 60 = 26 |
예제 입력 2)
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
0 | 10 | 30+ 20= 50 | max(20, 50) + 10= 60 | max(50, 80) + 50= 130 | max(80, 110) + 100= 210 | .. | .. |
1 | 20 | 40+ 10= 50 | max(10, 50) + 30= 80 | max(50, 60) + 50= 110 | max(60, 130) + 60 = 190 | .. | .. |
코드
import sys
t = int(sys.stdin.readline())
# 테스트 케이스만큼 반복
for _ in range(t):
n = int(sys.stdin.readline())
m1 = list(map(int, sys.stdin.readline().split())) # 첫 번째 줄 스티커의 점수
m2 = list(map(int, sys.stdin.readline().split())) # 두 번째 줄 스티커의 점수
# 반복문을 통해 각 스티커 인덱스의 최댓값을 구한다.
for i in range(1, n):
# 인덱스가 1일때 최댓값은 이전 대각선의 스티커 점수이다.
if i == 1:
m1[1] += m2[0]
m2[1] += m1[0]
# 인덱스가 1보다 클 경우에는
# 두칸 전에 스티커 값과 이전 스티커 값 중에서 큰 값과 현재 스티커의 값을 더한 값이 최댓값이 된다.
else:
m1[i] = max(m2[i - 1], m2[i - 2]) + m1[i]
m2[i] = max(m1[i - 1], m1[i - 2]) + m2[i]
print(max(m1[n - 1], m2[n - 1]))
github
GitHub - junjange/CodingTest: 내가 푼 코딩 테스트 문제와 해결법
내가 푼 코딩 테스트 문제와 해결법. Contribute to junjange/CodingTest development by creating an account on GitHub.
github.com
'CodingTest > Baekjoon' 카테고리의 다른 글
[baekjoon] 백준 9625번(파이썬): BABBA (0) | 2021.12.07 |
---|---|
[baekjoon] 백준 11057번(파이썬): 오른막 수 (0) | 2021.12.06 |
[baekjoon] 백준 1904번(파이썬): 01타일 (0) | 2021.12.04 |
[baekjoon] 백준 11052번(파이썬): 카드 구매하기 (0) | 2021.12.03 |
[baekjoon] 백준 1010번(파이썬): 다리 놓기 (0) | 2021.12.02 |