Skip to content

Commit 3eb56f6

Browse files
committed
[Silver I] Title: 스티커, Time: 268 ms, Memory: 178032 KB -BaekjoonHub
1 parent 1c86be3 commit 3eb56f6

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# [Silver I] 스티커 - 9465
2+
3+
[문제 링크](https://www.acmicpc.net/problem/9465)
4+
5+
### 성능 요약
6+
7+
메모리: 178032 KB, 시간: 268 ms
8+
9+
### 분류
10+
11+
다이나믹 프로그래밍
12+
13+
### 제출 일자
14+
15+
2025년 4월 16일 13:49:00
16+
17+
### 문제 설명
18+
19+
<p>상근이의 여동생 상냥이는 문방구에서 스티커 2n개를 구매했다. 스티커는 그림 (a)와 같이 2행 n열로 배치되어 있다. 상냥이는 스티커를 이용해 책상을 꾸미려고 한다.</p>
20+
21+
<p>상냥이가 구매한 스티커의 품질은 매우 좋지 않다. 스티커 한 장을 떼면, 그 스티커와 변을 공유하는 스티커는 모두 찢어져서 사용할 수 없게 된다. 즉, 뗀 스티커의 왼쪽, 오른쪽, 위, 아래에 있는 스티커는 사용할 수 없게 된다.</p>
22+
23+
<p><img alt="" src="https://www.acmicpc.net/upload/images/sticker.png" style="height:150px; width:575px"></p>
24+
25+
<p>모든 스티커를 붙일 수 없게된 상냥이는 각 스티커에 점수를 매기고, 점수의 합이 최대가 되게 스티커를 떼어내려고 한다. 먼저, 그림 (b)와 같이 각 스티커에 점수를 매겼다. 상냥이가 뗄 수 있는 스티커의 점수의 최댓값을 구하는 프로그램을 작성하시오. 즉, 2n개의 스티커 중에서 점수의 합이 최대가 되면서 서로 변을 공유 하지 않는 스티커 집합을 구해야 한다.</p>
26+
27+
<p>위의 그림의 경우에 점수가 50, 50, 100, 60인 스티커를 고르면, 점수는 260이 되고 이 것이 최대 점수이다. 가장 높은 점수를 가지는 두 스티커 (100과 70)은 변을 공유하기 때문에, 동시에 뗄 수 없다.</p>
28+
29+
### 입력
30+
31+
<p>첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가 주어지며, 각 정수는 그 위치에 해당하는 스티커의 점수이다. 연속하는 두 정수 사이에는 빈 칸이 하나 있다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다. </p>
32+
33+
### 출력
34+
35+
<p>각 테스트 케이스 마다, 2n개의 스티커 중에서 두 변을 공유하지 않는 스티커 점수의 최댓값을 출력한다.</p>
36+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
T = int(input())
2+
for _ in range(T):
3+
N = int(input())
4+
nums = [list(map(int, input().split())) for _ in range(2)]
5+
6+
dp = [[0] * (N+1) for _ in range(2)]
7+
8+
dp[0][1] = nums[0][0]
9+
dp[1][1] = nums[1][0]
10+
11+
for j in range(2, N+1):
12+
dp[0][j] = max(dp[1][j-1], dp[1][j-2]) + nums[0][j-1]
13+
dp[1][j] = max(dp[0][j-1], dp[0][j-2]) + nums[1][j-1]
14+
15+
print(max(dp[0][N], dp[1][N]))

0 commit comments

Comments
 (0)