파이썬 문자열 뒤집기: 5가지 전문가 기법 완벽 가이드
문자열은 문자의 순서 있는 시퀀스입니다. 파이썬에는 문자열을 뒤집는 내장 함수가 없지만, 다양한 방법으로 구현할 수 있습니다. 이 튜토리얼에서는 문자열을 뒤집는 5가지 대표적인 방법을 소개합니다.
방법 1: for 루프 사용
가장 직관적인 방법은 빈 문자열에 문자를 앞쪽에 계속 추가하는 것입니다.
def reverse_string(string):
reversed_string = ""
for char in string:
reversed_string = char + reversed_string
return reversed_string
string = "Guru99"
print(f"Original String: {string}")
print(f"Reversed String: {reverse_string(string)}")
Original String: Guru99
Reversed String: 99uruG
해설: reverse_string() 함수는 빈 문자열 reversed_string을 만들고, 각 문자를 순회하며 앞쪽에 붙여 나갑니다. 마지막에 완성된 문자열을 반환합니다.
방법 2: while 루프 사용
문자열 길이만큼 인덱스를 거꾸로 감소시키며 문자를 추출합니다.
string = "Python"
reversed_string = ""
count = len(string)
while count > 0:
reversed_string += string[count - 1]
count -= 1
print(f"Original String: {string}")
print(f"Reversed String: {reversed_string}")
Original String: Python
Reversed String: nohtyP
해설: len(string)으로 길이를 구한 후, count - 1 인덱스로 마지막 문자부터 첫 문자까지 접근하여 연결합니다.
방법 3: 슬라이스 연산자 ([::-1]) 사용
파이썬다운 가장 간결하고 빠른 방법입니다.
def reverse(string):
return string[::-1]
string = "Let's guru99"
print(f"Original String: {string}")
print(f"Reversed String: {reverse(string)}")
Original String: Let's guru99
Reversed String: 99urug s'teL
해설: [시작:끝:스텝]에서 스텝을 -1로 주면 역순으로 슬라이싱됩니다. 별도 함수 없이 string[::-1] 한 줄로 해결됩니다.
방법 4: reversed() 함수와 join() 결합
reversed()는 역순 이터레이터를 반환하므로, join()으로 문자열로 합쳐줍니다.
def reverse(string):
return "".join(reversed(string))
string = "guru99"
print(f"Original String: {string}")
print(f"Reversed String: {reverse(string)}")
Original String: guru99
Reversed String: 99urug
해설: reversed(string)은 문자열의 문자를 역순으로 순회하는 이터레이터를 반환합니다. "".join(...)으로 빈 문자열 구분자로 합쳐 최종 문자열을 만듭니다.
방법 5: 재귀 함수 사용
함수가 자기 자신을 호출하며 문자열을 한 글자씩 벗겨내 앞쪽에 붙입니다.
def reverse(string):
if len(string) == 0:
return string
else:
return reverse(string[1:]) + string[0]
string = "I love guru99"
print(f"Original String: {string}")
print(f"Reversed String: {reverse(string)}")
Original String: I love guru99
Reversed String: 99urug evol I
해설: 기본 케이스(길이 0)에서 문자열을 반환하고, 그렇지 않으면 첫 글자(string[0])를 뒤로 보내고 나머지(string[1:])로 재귀 호출합니다. 호출 스택이 풀리면서 역순 문자열이 완성됩니다.
성능 비교 및 권장 사항
| 방법 | 시간 복잡도 | 공간 복잡도 | 가독성 | 추천 용도 |
슬라이스 [::-1] | O(n) | O(n) | ★★★★★ | 대부분의 경우 (가장 파이썬다움) |
reversed() + join() | O(n) | O(n) | ★★★★☆ | 함수형 스타일 선호 시 |
| for 루프 | O(n²)* | O(n) | ★★★☆☆ | 교육용, 알고리즘 이해 |
| while 루프 | O(n) | O(n) | ★★★☆☆ | 인덱스 제어 필요 시 |
| 재귀 | O(n²)* | O(n) 스택 | ★★☆☆☆ | 교육용, 재귀 이해 |
* 문자열 연결 연산(+ 또는 +=)이 루프 내에서 일어나므로 실제로는 O(n²) 동작할 수 있습니다. 리스트에 모아 join하는 방식으로 최적화 가능합니다.
결론
- 실무에서는 슬라이스 연산자
string[::-1]을 사용하는 것이 가장 효율적이고 파이썬다운 방법입니다.
- 알고리즘 학습이나 면접 준비 목적이라면 for/while 루프와 재귀 방식도 이해해 두세요.
- 대용량 문자열 처리 시에는 문자열 불변성으로 인한 성능 저하를 고려해 리스트 컴프리헨션이나
io.StringIO 활용을 검토하세요.