[프로그래머스/Level3] 스티커 모으기(2) (JAVA)
📖 문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
💡 풀이 방식
• DP
[점화식]
dp[i] = Math.max(dp[i-1], dp[i-2] + sticker[i])
0번째 스티커를 뗐느냐/안 뗐느냐 여부에 따라 숫자의 합을 다르게 구한다.
1) 0번째 스티커를 뗀 경우, 1번째와 마지막 스티커는 뗄 수 없다.
// dp 배열 초기값
dp1[0] = sticker[0];
dp1[1] = sticker[0];
2) 0번째 스티커를 떼지 않은 경우, 마지막을 뜯을 수 있다.
// dp 배열 초기값
dp2[0] = 0;
dp2[1] = sticker[1];
또, 특정 위치 i에서도 스티커를 뗐느냐/안 뗐느냐 여부에 따라 2가지 경우로 구분할 수 있다.
1) 현재 위치를 뽑는 경우, dp[i-2] + sticker[i]
2) 현재 위치를 뽑지 않는 경우, dp[i-1]
이렇게 구한 두 dp 배열의 마지막 값 중 더 큰 값을 정답으로 출력한다.
💥 유의사항
스티커가 2개 이하인 경우에 대해 따로 처리를 해줘야 한다.
총 스티커 수가 1개면 하나만 떼면 되므로 sticker[0]이 정답이고,
총 스티커 수가 2개면 둘 중 큰 거 하나만 떼면 되므로 Math.max(sticker[0], sticker[1])이 정답이다.
🔺 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
class Solution {
public int solution(int sticker[]) {
int answer = 0;
// 예외 처리
if(sticker.length == 1) {
return sticker[0];
}
else if(sticker.length == 2) {
return Math.max(sticker[0], sticker[1]);
}
// 0번을 뜯는 경우 > 1번과 마지막은 뜯을 수 X.
int[] dp1 = new int[sticker.length - 1];
dp1[0] = sticker[0];
dp1[1] = sticker[0];
for(int i = 2 ; i < sticker.length - 1; i++) {
dp1[i] = Math.max(dp1[i-1], dp1[i-2] + sticker[i]);
}
// 0번을 뜯지 않은 경우 > 마지막 뜯을 수 있음
int[] dp2 = new int[sticker.length];
dp2[0] = 0;
dp2[1] = sticker[1];
for(int i = 2 ; i < sticker.length ; i++) {
dp2[i] = Math.max(dp2[i-1], dp2[i-2] + sticker[i]);
}
answer = Math.max(dp1[dp1.length - 1], dp2[dp2.length - 1]);
return answer;
}
}
|
cs |
💦 어려웠던 점
- 완전탐색으로 풀 생각을 했는데 다 틀려버렸다. (N이 10만이니까 10^2하면 안 될 걸 예상하고 자연스레 dp를 떠올려야 했는데)
🧐 새로 알게 된 내용
- dp를 사용할 생각!! 데이터 크기를 생각해야 한다는 걸 잊지 말자..
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
(참고)
✔ 풀이 참고
프로그래머스 - 스티커 모으기2(Java)
dp 문제입니다. 원형으로된 배열이 있고, 조건에 맞춰 원소를 뽑아 낼 때의 최댓값을 구하는 문제입니다. 하나의 원소를 뽑아낼 경우 양 쪽에 있는 원소는 뽑아낼 수 없습니다. 때문에 크게 두 가
ksb-dev.tistory.com
[프로그래머스] Lv 3 스티커 모으기 (2) (Java) 문제풀이 // DP, summer/winter coding(~2018)
정답률 48% Lv. 3 스티커 모으기 (2) 해결한 문제 : 454개 정답률이 50% 이하로 내려가면서부터 확실히 알...
blog.naver.com