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])
}