Algorithm
Algorithm) Programmers-스티커 모으기(2) swift
행복하고 싶은 사람
2022. 12. 5. 10:57
https://school.programmers.co.kr/learn/courses/30/lessons/12971
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
circular 형태여서 약간 더 생각해야하는 dp문제였습니다
dp 배열을 두개 만들었습니다.
dp1: 첫 스티커를 뜯은 dp
dp2: 두번째 스티커를 뜯은 dp
dp1은 첫번째 스티커를 뜯었으므로 마지막 스티커를 사용하지 못합니다 그래서 for문을 sticker.count-2까지 돌게했구요
dp2는 두번째 스티커를 뜯었으므로 마지막 스티커를 사용할 수 있습니다 그래서 for문을 sticker.count-1까지 돌게했습니다
[1,2,3,4,5,6,7]이면
dp1은 [1,2,3,4,5,6]에 대해 도는거고
dp2는 [2,3,4,5,6,7]에 대해 도는것이죠
import Foundation
func solution(_ sticker:[Int]) -> Int {
var dp1 = [Int](repeating:0, count: sticker.count)
var dp2 = [Int](repeating:0, count: sticker.count)
if sticker.count < 3 {
if sticker.count == 1 {
return sticker[0]
} else {
return max(sticker[0], sticker[1])
}
}
dp1[0] = sticker[0]
dp1[1] = dp1[0]
dp2[1] = sticker[1]
for i in 2..<sticker.count-1 {
dp1[i] = max(dp1[i-2] + sticker[i], dp1[i-1])
}
for i in 2..<sticker.count {
dp2[i] = max(dp2[i-2] + sticker[i], dp2[i-1])
}
return max(dp1[sticker.count-2], dp2[sticker.count-1])
}