이 튜토리얼은 문자열 관련 질문들을 해결하기 위해 파이썬 코드를 제시합니다.
여기서는 파이썬 문자열이 회문인지, 애너그램인지, 그리고 제목 케이스(title case)로 쓰여졌는지 확인하는 방법에 대해 알아봅니다.
파이썬 문자열: 간략한 소개
파이썬에서 문자열은 매우 유용한 내장 데이터 타입으로, 문자들의 순서를 저장할 수 있습니다.
파이썬 문자열 인덱싱: 파이썬의 모든 반복 가능한 객체와 마찬가지로, 문자열의 인덱스는 0부터 시작합니다. 따라서 길이가 N인 문자열에서 유효한 인덱스는 0, 1, 2, …, N-1입니다.
파이썬은 음수 인덱싱을 지원하여 문자열의 끝에서부터 요소에 접근할 수 있게 합니다. -1은 마지막 문자를, -2는 마지막에서 두 번째 문자를 가리킵니다.
파이썬 문자열의 불변성: 파이썬 문자열은 변경 불가능(immutable)하므로, 특정 위치에서 수정할 수 없습니다. 하지만 다양한 문자열 메서드를 사용하여 원하는 결과를 담은 새로운 문자열 복사본을 만들 수 있습니다.
이제 파이썬 문자열의 기본적인 내용을 살펴보았으니, 간단하면서도 흥미로운 문제들을 해결해 보겠습니다.
시작해 봅시다!
파이썬 문자열이 회문인지 확인하기
문제: 주어진 파이썬 문자열이 회문인지 판별해야 합니다.
회문이면 True를, 그렇지 않으면 False를 반환해야 합니다.
여기서 첫 번째 과제는 주어진 문자열이 회문인지 확인하는 것입니다.
회문이란, 앞에서부터 읽든 뒤에서부터 읽든 동일한 문자열을 의미합니다. 예를 들어, “racecar”, “refer”, “level”, “madam”, “radar” 등이 있습니다.
이 문제 해결 단계는 다음과 같습니다:
- 문자열의 역순 복사본을 만들고 필요한 경우 다른 변수에 저장합니다.
- 원래 문자열과 역순 문자열의 값을 비교합니다.
- 만약 두 값이 동일하다면, 문자열은 회문입니다. 이때 True를 반환하고 종료합니다.
- 만약 두 값이 다르다면, 문자열은 회문이 아닙니다. 이때 False를 반환해야 합니다.
핵심은 문자열의 역순 복사본을 생성하는 것입니다. 파이썬에서는 여러 가지 방법으로 이를 수행할 수 있습니다.
여기서는 두 가지 접근 방식을 살펴보겠습니다:
- 문자열 슬라이싱 사용
- reversed() 함수와 join() 메서드 조합 사용
슬라이싱을 이용한 파이썬 문자열 반전
<문자열>[start:stop:step]
구문은 문자열 <문자열>
의 일부를 start부터 stop까지(stop은 미포함) step 간격으로 잘라 반환합니다.
- start를 생략하면, 슬라이스는 문자열의 시작부터 시작합니다.
- stop 인덱스를 지정하지 않으면, 슬라이스는 문자열의 끝까지 확장됩니다.
- step에 음수값을 사용하면, 문자열의 끝에서 시작하는 슬라이스를 만들 수 있습니다.
따라서 <문자열>[::-1]
은 문자열의 역순 복사본을 반환합니다.
아래 코드 셀에는 is_palindrome() 함수 정의가 포함되어 있습니다.
이 함수는 문자열을 인자로 받아, 회문 여부에 따라 True 또는 False를 반환합니다.
여기서는 문자열의 역순 복사본을 만들기 위해 문자열 슬라이싱을 사용했습니다.
def is_palindrome(this_str): rev_str = this_str[::-1] if (this_str == rev_str): return True else: return False
이제 함수를 정의했으니, 유효한 문자열을 인자로 사용하여 호출해 봅시다.
is_palindrome("racecar") True
위 코드에서 “racecar”는 회문이므로 is_palindrome() 함수는 예상대로 True를 반환합니다.
이제 “river”와 같이 회문이 아닌 문자열로 함수를 호출해 봅시다.
is_palindrome("river") False
결과는 False입니다. 올바르게 작동하는 것을 확인할 수 있습니다. ✅
reversed() 및 join()을 활용한 파이썬 문자열 반전
파이썬에서 reversed() 함수와 join() 메서드를 함께 사용하여 문자열을 반전시킬 수 있습니다.
- reversed() 함수는 문자열의 문자들을 역순으로 순회하는 이터레이터를 반환합니다.
- join() 메서드를 사용하여 이 문자들을 역순으로 연결할 수 있습니다.
위 방법을 사용하여 is_palindrome() 함수를 다음과 같이 재작성할 수 있습니다:
def is_palindrome(this_str): rev_str="".join(reversed(this_str)) if (this_str == rev_str): return True else: return False
리스트 컴프리헨션과 is_palindrome() 함수를 함께 사용하면, 더 긴 문자열 목록에서 모든 회문을 모을 수도 있습니다.
str_list = ["refer","blue","level","12321","dragon"] palindromes = [string for string in str_list if is_palindrome(string)] print(palindromes) # Output ['refer', 'level', '12321']
위 코드가 작동하는 방식은 다음과 같습니다:
- str_list를 순회하면서 각 문자열에 대해 is_palindrome() 함수를 호출합니다.
- 만약 is_palindrome()이 True를 반환하면, 해당 문자열을 palindromes 리스트에 추가합니다.
결과에서 볼 수 있듯이, palindromes는 str_list에 있는 모든 회문 문자열을 담고 있는 리스트입니다.
두 파이썬 문자열이 애너그램인지 확인
인터뷰에서 자주 등장하는 또 다른 질문은 두 문자열 쌍(str1, str2)이 애너그램인지 확인하는 것입니다.
두 문자열이 정확히 동일한 문자 수를 가지면 애너그램이라고 합니다. 즉, 한 문자열의 문자들을 재배열하여 다른 문자열을 만들 수 있습니다.
애너그램의 예시로는 “state”와 “taste”, “save”와 “vase”, “elbow”와 “below” 등이 있습니다.
파이썬에서 Counter 객체를 사용해 애너그램 확인하기
간단하고 직관적인 방법은 두 문자열에서 각 문자가 나타나는 횟수를 세는 것입니다. 그다음, 이 횟수가 동일한지 확인하면 됩니다.
itertools 모듈의 Counter 객체를 사용하면 이 과정을 훨씬 쉽게 처리할 수 있습니다. Counter 객체는 파이썬 딕셔너리 형태로, 문자를 키로 사용하고 해당 문자의 개수를 값으로 사용합니다.
예를 들어, “save”와 “vase”라는 문자열을 고려해 보겠습니다.
str1 = "save" str2 = "vase"
여기서 c1과 c2는 각각 문자열 str1과 str2의 문자 개수를 포함하는 Counter 객체입니다.
from collections import Counter c1 = Counter(str1) c2 = Counter(str2) print(c1) print(c2) c1 == c2 # Output Counter({'s': 1, 'a': 1, 'v': 1, 'e': 1}) Counter({'v': 1, 'a': 1, 's': 1, 'e': 1}) True
c1 == c2는 str1과 str2가 애너그램이므로 True를 반환합니다.
이 논리를 활용하여 word1과 word2라는 두 개의 인자를 받는 are_anagrams() 함수를 정의할 수 있습니다. 함수 내부에서는 Counter(word1) == Counter(word2)인지 확인합니다.
def are_anagrams(word1, word2): if Counter(word1) == Counter(word2): return True else: return False
확인을 위해 str1, str2를 인자로 하여 are_anagrams()를 호출해 봅시다. str1과 str2는 애너그램(“save”와 “vase”)이므로, 함수는 True를 반환합니다. 이는 정확한 결과입니다.
are_anagrams(str1, str2) True
정렬된 문자열 복사본을 활용한 애너그램 확인 방법
이 문제를 해결하는 다른 방법도 있습니다.
만약 두 문자열이 애너그램이라면, 그 정렬된 복사본은 동일할 것입니다.
따라서 str1의 정렬된 복사본이 str2의 정렬된 복사본과 동일한지 확인하기 위해 are_anagrams() 함수를 재작성할 수 있습니다. 만약 같다면, 두 문자열은 애너그램이고, 그렇지 않으면 아닙니다.
위 방법을 사용하여 정렬된 복사본의 동일성을 확인한다면 are_anagrams() 함수는 다음과 같이 재작성할 수 있습니다:
def are_anagrams(word1, word2): if sorted(word1) == sorted(word2): return True else: return False
몇 가지 함수 호출을 해 보겠습니다.
- “elbow”와 “below” 문자열은 애너그램이며, are_anagrams() 함수는 True를 반환합니다.
- “state”와 “tasted”는 애너그램이 아니며, 함수는 False를 반환합니다.
are_anagrams("below","elbow") True are_anagrams("state","tasted") False
파이썬 문자열이 제목 케이스인지 확인
이 튜토리얼의 마지막 질문입니다.
문제: 사람의 이름(이름과 성을 포함)이 문자열로 주어집니다. 이 이름의 각 단어 첫 글자가 대문자인지 확인해야 합니다.
각 단어의 첫 글자가 대문자인 대/소문자 표기법을 제목 케이스라고 합니다.
따라서 주어진 이름이 제목 케이스로 되어있는지 확인해야 합니다.
1. 만약 그렇다면, 문자열이 제목 케이스로 서식이 지정되었다는 메시지를 출력합니다.
2. 만약 그렇지 않다면, 제목 케이스로 서식이 지정된 문자열 복사본을 반환합니다.
- 파이썬에는 문자열이 제목 케이스인지 여부를 확인하는 내장 문자열 메서드 istitle()이 있습니다.
<문자열>.istitle()
은 문자열 <문자열>
이 제목 케이스로 서식이 지정되었다면 True를 반환하고, 그렇지 않으면 False를 반환합니다.
- 그리고 파이썬의 문자열 메서드 title()은 제목 케이스로 서식이 지정된 문자열의 복사본을 반환합니다.
이제 이 두 메서드를 사용하여 문제를 해결할 수 있습니다.
name을 인자로 받는 check_titlecase() 함수를 정의합니다.
- 입력 문자열에서 istitle() 메서드를 호출하여 제목 케이스로 서식이 지정되었는지 확인합니다.
- 만약 True라면, 문자열이 이미 제목 케이스를 사용하고 있음을 출력합니다.
- 그렇지 않으면, title() 메서드를 호출하고 제목 케이스로 서식이 지정된 문자열의 복사본을 반환합니다.
다음 코드 셀은 check_titlecase() 함수의 정의를 보여줍니다.
def check_titlecase(name): if name.istitle(): print(f"'{name}' is already formatted in title case.") else: return name.title()
이제 인수를 사용하여 check_titlecase() 메서드를 호출해 보겠습니다.
check_titlecase("jane smith") # Output Jane Smith
결과에서 문자열 “Jane Smith”가 제목 케이스로 변경된 것을 볼 수 있습니다.
다른 예를 살펴보겠습니다.
check_titlecase("agatha Christie") # Output Agatha Christie
이번에는 제목 케이스로 된 문자열로 함수를 호출해 보겠습니다.
check_titlecase("Grace Hopper") # Output 'Grace Hopper' is already formatted in title case.
문자열이 제목 케이스로 서식이 지정되어 있으며, 함수가 예상대로 작동한다는 메시지를 받습니다.
결론 👩🏫
지금까지 논의한 내용을 요약해 보겠습니다.
- 문자열이 회문인지 확인하려면, 문자열과 그 역순 버전이 동일한지 확인합니다. 문자열 슬라이싱이나 내장 메서드를 사용하여 문자열을 반전시킬 수 있습니다.
- 두 문자열이 애너그램인지 확인하려면, 정렬된 복사본이 동일한지 확인합니다. 내장된 sorted() 함수를 사용하여 문자열을 정렬할 수 있습니다.
- 이름이 제목 케이스인지 확인하려면, .istitle() 메서드를 사용하여 확인하고, .title() 메서드를 사용하여 문자열의 제목 케이스 복사본을 가져올 수 있습니다.
파이썬 문자열에 대한 이 튜토리얼이 유익했기를 바랍니다. 다음 단계로 Python에서 리스트 컴프리헨션 사용법을 배우거나, 파이썬의 같지 않음 연산자에 대해 알아보세요.
즐거운 학습과 코딩되세요!🎉