오늘은 백준 3986 - 좋은 단어 문제를 풀었습니다.
처음에는 어려워 보였지만, 시간을 두고 천천히 고민한 결과 해결할 수 있었습니다.
처음에는 인덱스를 활용한 방법을 시도했습니다:
어제 99클럽 온라인 특강에서 배운 스택 자료구조를 떠올렸고, 이를 활용한 해결책을 찾았습니다.
func isBeautyNums(_ target: String) -> Bool {
guard target.count % 2 == 0 else { return false }
var targetArray = target.map { String($0) }
let aCountsIsEven = targetArray.filter { $0 == "A" }.count % 2 == 0
guard aCountsIsEven else { return false }
var stack = [String]()
for char in targetArray {
if char == stack.last {
stack.removeLast()
} else {
stack.append(char)
}
}
return stack.isEmpty
}
이 방법은 스택을 사용하여 짝을 이루는 문자를 효율적으로 처리할 수 있었습니다.
스택을 사용하여 문제를 해결하니 코드가 훨씬 단순하고 명확해졌습니다.
우선 짝이 맞아야 하니 문자열의 길이가 짝수여야 하고, A 문자도 짝수여야 합니다.
전체가 짝수고 A가 짝수면 B도 짝수이니 B에 대한 검증은 하지 않아도 되겠죠.
이런 생각을 하면서 문제를 풀어가니, 마치 퍼즐을 맞추는 기분이었습니다.
이 알고리즘의 시간 복잡도를 분석해보면 다음과 같습니다:
count
는 O(1)입니다. 이는 배열의 길이를 가져오는 연산으로, 상수 시간에 수행됩니다.filter
는 O(n)입니다. 이는 배열의 각 요소를 검사하기 때문에 입력 크기 n에 비례합니다.for
문은 O(n)입니다. 이는 배열의 각 요소를 순회하기 때문에 입력 크기 n에 비례합니다.append
와 removeLast()
는 O(1)입니다. 이는 스택의 끝에 요소를 추가하거나 제거하는 연산으로, 상수 시간에 수행됩니다.결국 이 알고리즘의 전체 시간 복잡도는 가장 높은 차수의 연산인 O(n)입니다.