https://school.programmers.co.kr/learn/courses/30/lessons/12971
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr

첫번째 스티커를 포함한 경우 / 포함하지 않은 경우로 나누고 dp로 풀었다.
1. dp[i][0]
첫 번째 포함했을 때의 i번째 스티커까지 최댓값
dp[i][0] = max(dp[i-2][0]+sticker[i], dp[i-1][0])
- dp[i-2][0] + sticker[i]: i-2 번째를 포함하고, i-1는 포함하지 않고 (찢어져서 못씀), i를 포함한 경우
- dp[i-1][0] : i-1를 포함하고, i번째 포함하지 않는 경우
이때 첫 번째 스티커를 포함한 경우에는, 마지막 스티커는 포함 불가하므로 i = n-1 제외
2. dp[i][1]
첫 번째 포함 안했을 때의 i번째 스티커까지 최댓값
dp[i][1] = max(dp[i-2][1]+sticker[i], dp[i-1][1])
- dp[i-2][1] + sticker[i]: i-2 번째를 포함하고, i-1는 포함하지 않고 (찢어져서 못씀), i를 포함한 경우
- dp[i-1][1] : i-1를 포함하고, i번째 포함하지 않는 경우
dp[i][0] != i번째를 포함했을 때 최댓값, dp[i][1] != i번째를 포함 안했을 때 최댓값
1차원 벡터 dp1, dp2를 2차원 벡터에 넣어서 dp[i][0], dp[i][1] 로 저장한 형태
⭐️ input 갯수가 10만까지였는데, vector를 쓰니 효율성에서 걸렸다. 이때 int 배열로 바꿔주니 해결됐다 !
#include <algorithm>
#include <cstring>
#include <iostream>
#include <vector>
using namespace std;
int solution(vector<int> sticker) {
int n = sticker.size();
if (n == 1) {
return sticker[0];
}
int dp[n][2];
memset(dp, 0, sizeof(dp));
dp[0][0] = sticker[0]; // dp[i][0] = 1번째 스티커 포함
dp[1][0] = sticker[0];
dp[0][1] = 0; // dp[i][1] = 1번째 스티커 포함 X
dp[1][1] = sticker[1];
for (int i = 2; i < n; i++) {
if (i != n - 1) {
dp[i][0] = max(dp[i - 1][0], dp[i - 2][0] + sticker[i]);
}
dp[i][1] = max(dp[i - 1][1], dp[i - 2][1] + sticker[i]);
}
return max(dp[n - 2][0], dp[n - 1][1]);
}반응형
'알고리즘 > 프로그래머스' 카테고리의 다른 글
| [PG / SQL] 프로그래머스 SQL 고득점 Kit - SELECT (0) | 2025.09.11 |
|---|---|
| [PG / C++] 프로그래머스 단어 변환 (1) | 2025.05.26 |
| [PG / C++] 프로그래머스 가장 큰 수 (0) | 2025.02.18 |
| [PG / C++] 프로그래머스 등굣길 (0) | 2025.02.15 |
| [PG / C++] 프로그래머스 베스트앨범 (0) | 2025.02.13 |