# 초기 풀이
- Set 자료구조 써서 K 소비한 배열 정보를 그대로 담도록 구현했었음.
- 메모리 초과
import Foundation
let NK = readLine()!.split(separator: " ").map { Int($0)! }; let N = NK[0]; let K = NK[1]
let S = readLine()!.split(separator: " ").map { Int($0)! }
var dp: [Set<[Int]>] = .init(repeating: .init(), count: K + 4)
var ret = Int.min
func even(_ array: [Int]) -> Int {
var count = 0
var ret = 0
for i in array {
if i % 2 == 0 {
count += 1
} else {
ret = max(count, ret)
count = 0
}
}
return count
}
dp[0] = .init(arrayLiteral: S)
for i in 1...K {
for sub in dp[i-1] {
for elem in sub {
dp[i].insert(sub.filter({ elem != $0 }))
}
}
for sub in dp[i] {
ret = max(ret, even(sub))
}
}
print(ret)
# 풀이
- 풀이 이전에 연속된 짝수 갯수 계산을 위해서는 K개만큼 홀수 숫자를 삭제해야 함을 알아야 한다.
- go 함수에 전달하는 index파라미터 기준으로 소모한 K 갯수를 가지고 분기처리를 진행한다.
- 현재 인덱스값이 짝수인 경우 length + 1로 재귀호출
- 홀수인 경우 k 하나 소모해서 다음 인덱스로 넘어가기
- k 소모 갯수가 한계치 K값과 동일한 경우 재귀 멈추고 리턴
- 전체 인덱스마다 K를 0부터 K까지 증가시켜가면서 맥스값을 최종 리턴
import Foundation
let NK = readLine()!.split(separator: " ").map { Int($0)! }; let N = NK[0]; let K = NK[1]
let S = readLine()!.split(separator: " ").map { Int($0)! }
var dp: [[Int]] = .init(repeating: .init(repeating: 0, count: K+4), count: N+4)
var ret = Int.min
if N == 1 {
if S[0] % 2 == 0 {
print(1)
} else {
print(0)
}
exit(0)
}
func go(_ k: Int, _ index: Int, _ length: Int) -> Int {
if k > K || index < 0 { return length } // 소모한 k 갯수가 주어진 K보다 크면 전부 소모한 것
if dp[index][k] != 0 { return length } // index까지 k개 소모한 갯수 계산이 이미 이루어졌으면 갯수 리턴, 중복 줄이기
var value = 0
if S[index] % 2 == 0 {
value = go(k, index-1, length+1)
}
else if k == K { return length } // k 완전히 소모한 경우
else if k < K {
value = go(k + 1, index - 1, length) // 현재 인덱스값 홀수이면서 소모
}
dp[index][k] = value
return dp[index][k]
}
for i in (1...N-1).reversed() {
for j in 0...K {
ret = max(go(j, i, 0), ret)
}
}
print(ret)