백준 - DNA 비밀번호 (12891)

Seoyoung Lee·2023년 1월 17일
0

알고리즘

목록 보기
10/104
post-thumbnail
let input = readLine()!.split(separator: " ").map{ Int(String($0))! }
let (S, P) = (input[0], input[1])
let sequence = Array(readLine()!)
let condition = readLine()!.split(separator: " ").map{ Int(String($0))! }

var answer = 0
var current = [0, 0, 0, 0]
var checkSecret = condition.filter{ $0 == 0 }.count
var start = 0, end = P-1

for i in 0...end {
    add(String(sequence[i]))
}
start += 1
end += 1

if checkSecret == 4 {
    answer += 1
}

while end < sequence.count {
    remove(String(sequence[start-1]))
    add(String(sequence[end]))
    
    if checkSecret == 4 {
        answer += 1
    }
    start += 1
    end += 1

}

print(answer)

func add(_ letter: String) {
    var index = 0
    if letter == "A" {
        index = 0
    } else if letter == "C" {
        index = 1
    } else if letter == "G" {
        index = 2
    } else {
        index = 3
    }
    current[index] += 1
    if current[index] == condition[index] {
        checkSecret += 1
    }
}

func remove(_ letter: String) {
    var index = 0
    if letter == "A" {
        index = 0
    } else if letter == "C" {
        index = 1
    } else if letter == "G" {
        index = 2
    } else {
        index = 3
    }
    if current[index] == condition[index] {
        checkSecret -= 1
    }
    current[index] -= 1
}
  • 사용 알고리즘: 슬라이딩 윈도우

주어진 {‘A’, ‘C’, ‘G’, ‘T’} 의 최소 개수 중에 0인 것이 있으면 조건을 만족한 것으로 간주하고 처음부터 checkSecret 의 값을 증가시켜주어야 한다.

profile
나의 내일은 파래 🐳

0개의 댓글