두 문자열이 서로 다른 순서라도 동일한 문자들로 구성되어 있다면, 이 둘을 아나그램(Anagram)이라고 합니다. 예를 들어 "cat"과 "tac"은 같은 문자를 포함하고 있으므로 서로 아나그램 관계입니다. 이 튜토리얼에서는 파이썬의 collections.Counter() 메서드를 사용해 두 문자열이 아나그램인지 확인하는 방법을 알아보겠습니다.
입력: string_one = "cat" string_two = "tac" 출력: True
collections.Counter()란?
collections.Counter()는 문자열 내 각 문자의 빈도수(frequency)를 담은 딕셔너리 형태의 객체를 반환합니다. Counter 객체는 가장 많이 등장한 요소 조회(most_common), 고유 요소 추출, 개수 세기 등 다양한 유용한 메서드를 제공합니다.
간단한 예제를 통해 살펴보겠습니다.
예제
# collections 모듈 임포트
import collections
# Counter 객체 생성
counter = collections.Counter("Hafeez")
# Counter 출력
print(counter)
# 문자열에서 가장 많이 등장한 문자 출력
print("\nMost common character")
print(counter.most_common(1))실행 결과
위 프로그램을 실행하면 다음과 같은 결과를 얻을 수 있습니다.
Counter({'e': 2, 'H': 1, 'a': 1, 'f': 1, 'z': 1})
Most common character
[('e', 2)]실행 결과에서 볼 수 있듯이, Counter는 각 문자가 몇 번 나타나는지 자동으로 계산해 줍니다. "Hafeez"에서는 문자 'e'가 2번으로 가장 많이 등장했습니다.
아나그램 판별 알고리즘
Counter를 활용하면 아나그램 여부를 아주 간단하게 판별할 수 있습니다. 두 문자열의 Counter 객체가 같다는 것은 두 문자열이 동일한 문자를 동일한 개수만큼 포함하고 있다는 의미이며, 곧 아나그램 관계임을 뜻합니다.
1. 두 개의 문자열을 초기화한다. 2. 각 문자열에 대해 collections.Counter() 객체를 생성한다. 3. 두 객체가 같은지 비교한다. 3.1. 같으면 True 출력 4. 다르면 False 출력
예제
# collections 모듈 임포트
import collections
# 문자열 초기화
string_one = "cat"
string_two = "atc"
# 두 문자열의 Counter 객체 비교
if collections.Counter(string_one) == collections.Counter(string_two):
# 같으므로 True 출력
print(True)
else:
# 다르므로 False 출력
print(False)실행 결과
위 프로그램을 실행하면 다음과 같은 결과를 얻을 수 있습니다.
True
"cat"과 "atc"는 모두 c, a, t를 한 번씩 포함하고 있으므로 두 Counter 객체가 동일하고, 그 결과 True가 출력됩니다.
마무리
collections.Counter()를 사용하면 문자열을 정렬하지 않고도 선형 시간(O(n)) 안에 아나그램 여부를 손쉽게 확인할 수 있습니다. 튜토리얼을 따라 하면서 궁금한 점이나 어려운 부분이 있다면 댓글로 남겨주세요.