프로그래밍/Swift

Swift에서 lstrip과 rstrip

도츠(Dotz) 2025. 6. 16. 08:10

lstriprstrip 구현

Swift에는 Python의 lstriprstrip에 해당하는 기본 제공 함수가 없습니다.

 

하지만 Swift의 String 클래스와 CharacterSet을 활용하면 이와 동일한 기능을 구현할 수 있습니다.

 

아래는 lstriprstrip의 구현 코드입니다.


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의 성능은 다음과 같은 요소에 의해 결정됩니다:

  1. 복잡도:
    • 두 함수 모두 문자열의 앞 또는 뒤에서 순차적으로 문자 제거를 시도하므로 **O(n)**의 시간 복잡도를 가집니다.
      여기서 n은 문자열의 길이입니다.
    • 각 루프에서 문자열을 반복적으로 재할당(dropLast, dropFirst)하기 때문에 문자열이 길수록 반복 작업이 많아질 수 있습니다.
  2. 문자 집합(CharacterSet):
    • .whitespacesAndNewlines와 같은 기본 제공 CharacterSet은 효율적으로 동작하도록 최적화되어 있습니다.
    • 사용자 정의 CharacterSet은 더 많은 범위를 포함할 경우 성능이 저하될 가능성이 있습니다.
  3. 메모리 사용:
    • 문자열이 dropFirst나 dropLast로 반복적으로 생성되므로 메모리 사용량이 증가할 수 있습니다.
    • 아주 큰 문자열의 경우 성능 최적화를 위해 직접적인 인덱스 조작으로 개선 가능성이 있습니다.
  4. 일반적인 성능:
    • 평균적으로 문자열이 수백에서 수천 자일 때에도 성능 저하 없이 동작합니다.
    • 그러나 매우 큰 문자열(예: 수백만 자)에서는 성능을 고려해 다른 방법으로 최적화가 필요할 수 있습니다.

성능 최적화 팁

만약 위 함수에서 성능 병목 현상이 발생한다면 다음 방법을 고려해보세요:

  1. Substring 활용:
    Substring을 사용하여 불필요한 문자열 재할당을 줄입니다.
  2. 한 번에 제거:
    trimmingCharacters(in:)와 정규식 등을 조합해 앞과 뒤를 동시에 처리합니다.