문자열 myString
과 pat
이 주어집니다. myString
에서 pat
이 등장하는 횟수를 반환하는 solution
함수를 완성해 주세요.
제한사항
myString
의 길이 ≤ 1000pat
의 길이 ≤ 10입출력 예
| myString | pat | result |
|----------|------|--------|
| "banana" | "ana" | 2 |
| "aaaa" | "aa" | 3 |
import Foundation
func solution(_ myString: String, _ pat: String) -> Int {
return myString.components(separatedBy: pat).count - 1
}
components(separatedBy:)
방식은 이러한 경우를 정확하게 다루지 못했다.import Foundation
func solution(_ myString: String, _ pat: String) -> Int {
var count = 0
var searchRange = myString.startIndex..<myString.endIndex
while let range = myString.range(of: pat, options: [], range: searchRange) {
count += 1
searchRange = range.upperBound..<myString.endIndex
}
return count
}
searchRange
를 range.upperBound
로 갱신하면서, 겹치는 패턴을 제대로 찾지 못했다. 예를 들어 "aaaa"에서 "aa"를 찾을 때, 첫 번째 "aa" 이후에 바로 다음 패턴을 찾기 때문에 중첩된 부분을 놓치게 된다.import Foundation
func solution(_ myString: String, _ pat: String) -> Int {
var count = 0
var searchRange = myString.startIndex..<myString.endIndex
while let range = myString.range(of: pat, options: [], range: searchRange) {
count += 1
// 패턴이 겹쳐도 찾을 수 있도록 시작점을 한 칸 앞으로 이동
searchRange = myString.index(after: range.lowerBound)..<myString.endIndex
}
return count
}
components(separatedBy:)
를 사용하여 패턴을 기준으로 나누고, 그 조각 수에서 1을 빼는 방식으로 시도했지만, 겹치는 패턴의 경우를 놓쳤다.while
루프와 range(of:)
를 사용해 패턴을 찾고 범위를 갱신하면서 반복했으나, 중첩된 패턴을 찾는 데 실패했다.range.lowerBound
이후로 검색 범위를 갱신하는 방식으로 수정해, 겹치는 패턴도 모두 찾을 수 있도록 했다.pat
)를 기준으로 나누어 배열로 반환한다. 예를 들어, 문자열 "banana"에서 components(separatedBy: "an")
을 사용하면 ["b", "a", "a"]라는 배열이 반환된다. 이 방법은 간단하지만, 중첩된 패턴을 찾는 데에는 한계가 있다.options
와 range
매개변수를 통해 검색 방식과 범위를 조정할 수 있다. 예를 들어, 문자열 "banana"에서 range(of: "ana")
를 사용하면 첫 번째 "ana"의 범위를 반환한다.range(of:)
와 index(after:)
를 사용해 문자열을 탐색하고, 범위를 적절히 조정하여 모든 패턴을 찾는 방법을 익혔다.