Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 문자열 슬라이싱으로 재귀 삭제를 통해 문자열이 빈 문자열이 되는지 확인하기

이 튜토리얼에서는 주어진 문자열에서 특정 부분 문자열을 반복적으로(재귀적으로) 삭제했을 때, 문자열이 결국 빈 문자열이 되는지 확인하는 프로그램을 작성해 보겠습니다. 먼저 예시를 통해 문제를 자세히 이해해 보겠습니다.

입력

string = "tutorialstutorialspointpoint"
sub_string = "tutorialspoint"

출력

True
  • 첫 번째 반복 후 tutorialstutorialspointpointtutorialspoint가 됩니다.
  • 두 번째 반복 후에는 문자열이 완전히 비게 됩니다.

문자열의 내장 메서드인 find()를 활용하면 이 문제를 간단하게 해결할 수 있습니다. 다음 단계에 따라 프로그램을 작성해 보겠습니다.

  • stringsub_string을 초기화합니다.
  • 둘 중 하나라도 빈 값이라면 False를 반환합니다.
  • string의 길이가 0보다 큰 동안 다음 작업을 반복합니다.
    • sub_stringstring 안에 존재하는지 확인합니다.
    • 존재하지 않으면 False를 반환합니다.
    • 존재하면 해당 위치를 기준으로 앞부분과 뒷부분을 이어 붙여 sub_string을 제거합니다.
  • 루프가 중간에 중단되지 않고 정상적으로 종료되었다면 True를 반환합니다.

예제 코드

def is_valid(string, sub_string):
    # string과 sub_string의 길이 확인
    if len(string) > 0 and len(sub_string) > 0:
        # string이 빌 때까지 반복
        while len(string) > 0:
            # string에서 sub_string의 위치 찾기
            index = string.find(sub_string)
            # sub_string이 존재하지 않는 경우
            if index == -1:
                return False
            # 슬라이싱으로 sub_string 제거
            string = string[0:index] + string[index + len(sub_string):]
        # 루프가 정상 종료되면 True 반환
        return True
    else:
        # 빈 문자열인 경우 False 반환
        return False

if __name__ == '__main__':
    # string과 sub_string 초기화
    string = 'tutorialstutorialspointpoint'
    sub_string = 'tutorialspoint'
    # 함수 호출
    print(is_valid(string, sub_string))

실행 결과

위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.

True

동작 원리 살펴보기

코드가 실제로 어떻게 진행되는지 단계별로 확인해 보겠습니다.

  • 첫 번째 검사에서 "tutorialspoint"는 인덱스 9에서 발견됩니다. 이를 제거하면 "tutorials" + "point" = "tutorialspoint"가 됩니다.
  • 두 번째 검사에서 "tutorialspoint"는 인덱스 0에서 발견되며, 제거하면 문자열이 완전히 비게 됩니다.
  • while 루프의 조건(len(string) > 0)이 더 이상 만족되지 않아 루프가 종료되고 최종적으로 True가 반환됩니다.

마무리

이처럼 find() 메서드와 문자열 슬라이싱만 활용해도 복잡한 알고리즘 없이 문제를 깔끔하게 해결할 수 있습니다. 핵심은 매 반복마다 부분 문자열의 위치를 찾아 제거하고, 찾지 못할 경우 즉시 실패로 처리하는 것입니다. 이 튜토리얼에 대해 궁금한 점이 있다면 댓글로 남겨주세요.