알고리즘/프로그래머스
[프로그래머스 알고리즘] 스티커모으기(2) JavaScript JS
kku_lurgi
2023. 8. 30. 17:51
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
😉문제 풀이 설명
위 문제는 DP문제입니다.
따라서 점화식을 구하고, 이에 따른 코드를 작성할 필요가 있습니다.
점화식은 다음과 같습니다.
dp[i] = Math.max(dp[i - 1], dp[i - 2] + sticker[i])
🤨주의 사항
dp[i] 배열을 순회할 때 참조하는 인덱스는 i-1과 i-2입니다. 따라서 dp 배열의 0번째 인덱스와 1번째 인덱스는 값을 채워주고 순회를 시작해야 합니다.
문제에서 스티커는 원형으로 연결되어 있습니다. 따라서 첫 번째 스티커를 떼는 경우와 떼지 않는 경우 두 가지를 생각하여야 합니다.
//첫 번째 스티커를 떼는 경우
const dp1 = [sticker[0],sticker[0],...Array(length-2).fill(0)];
//첫 번째 스티커를 떼지 않는 경우
const dp2 = [0,sticker[1],...Array(length-2).fill(0)];
😎문제 풀이 코드
function solution(sticker) {
const length = sticker.length;
if(length === 1) return sticker[0]
const dp1 = [sticker[0],sticker[0],...Array(length-2).fill(0)];
const dp2 = [0,sticker[1],...Array(length-2).fill(0)];
for(let i = 2; i < length; i++){
dp1[i] = Math.max(dp1[i - 1], dp1[i - 2] + sticker[i]);
dp2[i] = Math.max(dp2[i - 1], dp2[i - 2] + sticker[i]);
}
return Math.max(dp1[length - 2], dp2[length - 1]);
}