반응형
1. 문제
https://school.programmers.co.kr/learn/courses/30/lessons/12971
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
2. 코드
해당 문제는 앞의 값을 저장해가는 누적합을 사용해야 하기 때문에 DP가 사용된다.
총 두 가지 경우가 있고, 이 두 가지 경우를 분기처리 하여 누적합을 구해준 뒤 최댓값을 산출해주면 된다.
- 첫번째 스티커 떼고 시작하는 경우(마지막 스티커 사용 못하고 끝남)
- 첫번째 스티커 떼지 않고 시작하는 경우(마지막 스티커 사용하고 끝남)
총 두 가지 경우를 나누어, 이전 스티커를 떼었을 경우와 이전 스티커를 떼지 않아 현재 스티커를 뗄 수 있는 경우의 최댓값을 구해 더해가면 된다.
function solution(sticker) {
const len = sticker.length + 2; // i-2 요소 값을 구해야하기 때문
const dp1 = new Array(len).fill(0); // 첫번째 스티커 뜯은 경우
const dp2 = new Array(len).fill(0); // 첫번째 스티커 뜯지 않은 경우
if(sticker.length === 1) return sticker[0]; // 스티커가 하나 일 때
// 첫번째 스티커 뜯고 시작하는 경우
for(let i = 2; i < len-1; i++)
// 이전의 스티커를 뜯어 지금 스티커를 뜯을 수 없는 경우(지금까지의 합)
// 이전의 스티커를 뜯지 않아 지금 스티커를 뜯을 수 있는 경우(지금까지의 합 + 현재 스티커 값)
dp1[i] = Math.max(dp1[i-1], dp1[i-2] + sticker[i-2]);
// 첫번째 스티커 뜯지 않고 시작하는 경우
for(let i = 3; i < len; i++)
dp2[i] = Math.max(dp2[i-1], dp2[i-2] + sticker[i-2]);
return Math.max(dp1[len-2], dp2[len-1]); // 첫번째 뜯은 경우의 len-2에, 뜯지 않은 경우는 len-1에 최댓값 있음
}
이해에 참고한 블로그)
[프로그래머스] LV.3 스티커 모으기 (JS)
N개의 스티커가 원형으로 연결되어 있습니다. 다음 그림은 N = 8인 경우의 예시입니다.원형으로 연결된 스티커에서 몇 장의 스티커를 뜯어내어 뜯어낸 스티커에 적힌 숫자의 합이 최대가 되도록
velog.io
어렵다!! 이건 많이 풀어보는게 답인 듯 하다...그래 bfs,dfs 때도 이랬잖아! 할 수 있다!!!!
그래도 DP, 투포인터 너어어무 어렵다 ㅠㅠㅠ
복기
6/28
반응형
'프로그래머스 > DP' 카테고리의 다른 글
[DP] 프로그래머스 '숫자 변환하기' - js (0) | 2023.04.26 |
---|---|
[피보나치] 프로그래머스 '2xn 타일링' - js (0) | 2023.04.22 |
[DP] 프로그래머스 '땅따먹기' - js (0) | 2023.04.11 |
[피보나치] 프로그래머스 '멀리뛰기' - js (0) | 2022.10.20 |