lstrip
과 rstrip
구현
Swift에는 Python의 lstrip
과 rstrip
에 해당하는 기본 제공 함수가 없습니다.
하지만 Swift의 String
클래스와 CharacterSet
을 활용하면 이와 동일한 기능을 구현할 수 있습니다.
아래는 lstrip
과 rstrip
의 구현 코드입니다.
rstrip
rstrip
은 문자열의 끝에서 지정한 문자 집합에 해당하는 문자를 제거
extension String {
func rstrip(_ characterSet: CharacterSet) -> String {
var trimmed = self
while let lastChar = trimmed.unicodeScalars.last, characterSet.contains(lastChar) {
trimmed = String(trimmed.dropLast())
}
return trimmed
}
}
// 사용 예시
let stringWithWhitespace = " Hello, World! "
let strippedString = stringWithWhitespace.rstrip(.whitespacesAndNewlines)
print(strippedString) // 출력: " Hello, World!"
lstrip
lstrip
은 문자열의 시작에서 지정한 문자 집합에 해당하는 문자를 제거
extension String {
func lstrip(_ characterSet: CharacterSet) -> String {
var trimmed = self
while let firstChar = trimmed.unicodeScalars.first, characterSet.contains(firstChar) {
trimmed = String(trimmed.dropFirst())
}
return trimmed
}
}
// 사용 예시
let stringWithWhitespace = " Hello, World! "
let strippedString = stringWithWhitespace.lstrip(.whitespacesAndNewlines)
print(strippedString) // 출력: "Hello, World! "
성능 분석
lstrip과 rstrip의 성능은 다음과 같은 요소에 의해 결정됩니다:
- 복잡도:
- 두 함수 모두 문자열의 앞 또는 뒤에서 순차적으로 문자 제거를 시도하므로 **O(n)**의 시간 복잡도를 가집니다.
여기서 n은 문자열의 길이입니다. - 각 루프에서 문자열을 반복적으로 재할당(dropLast, dropFirst)하기 때문에 문자열이 길수록 반복 작업이 많아질 수 있습니다.
- 두 함수 모두 문자열의 앞 또는 뒤에서 순차적으로 문자 제거를 시도하므로 **O(n)**의 시간 복잡도를 가집니다.
- 문자 집합(CharacterSet):
- .whitespacesAndNewlines와 같은 기본 제공 CharacterSet은 효율적으로 동작하도록 최적화되어 있습니다.
- 사용자 정의 CharacterSet은 더 많은 범위를 포함할 경우 성능이 저하될 가능성이 있습니다.
- 메모리 사용:
- 문자열이 dropFirst나 dropLast로 반복적으로 생성되므로 메모리 사용량이 증가할 수 있습니다.
- 아주 큰 문자열의 경우 성능 최적화를 위해 직접적인 인덱스 조작으로 개선 가능성이 있습니다.
- 일반적인 성능:
- 평균적으로 문자열이 수백에서 수천 자일 때에도 성능 저하 없이 동작합니다.
- 그러나 매우 큰 문자열(예: 수백만 자)에서는 성능을 고려해 다른 방법으로 최적화가 필요할 수 있습니다.
성능 최적화 팁
만약 위 함수에서 성능 병목 현상이 발생한다면 다음 방법을 고려해보세요:
- Substring 활용:
Substring을 사용하여 불필요한 문자열 재할당을 줄입니다. - 한 번에 제거:
trimmingCharacters(in:)와 정규식 등을 조합해 앞과 뒤를 동시에 처리합니다.