하나의 문자열이 주어졌을 때, 그 안에서 두 번 이상 등장하는 문자(빈도가 1보다 큰 문자)를 모두 찾아내는 것이 이번 글의 목표입니다.
예를 들어 "Hello World. Let's learn Python"이라는 문자열이 있다고 가정해 보겠습니다. 알고리즘은 여러 번 나타나는 문자들을 자동으로 찾아내며, 실행 결과는 다음과 같은 형태로 출력됩니다.
e : 3 l : 4 o : 3 <공백> : 4 r : 2 t : 2 n : 2
Counter() 메서드란?
이 문제는 파이썬의 collections 모듈에 포함된 Counter() 메서드를 사용하면 매우 간단하게 해결할 수 있습니다. Counter()는 해시 가능한(hashable) 객체의 개수를 세어주는 도구로, 문자열에 적용하면 각 문자를 딕셔너리의 키(key)로, 해당 문자가 등장한 횟수를 값(value)으로 만들어 줍니다. 즉, 별도의 반복문 없이도 문자별 빈도를 한 번에 계산할 수 있습니다.
알고리즘
1단계: 문자열에서 키-값 쌍을 추출합니다. 각 문자가 키가 되고, 문자의 등장 횟수가 값이 됩니다. 2단계: 각 키를 순회하면서 값이 1보다 큰지 확인합니다. 3단계: 값이 1보다 크면 중복 문자이므로 출력하고, 그렇지 않으면 무시합니다.
예제 코드
from collections import Counter
def calc_char_freq(string):
freq_count = Counter(string) # 문자를 키로, 빈도를 값으로 하는 딕셔너리 생성
for key in freq_count.keys():
if freq_count.get(key) > 1: # 빈도가 1보다 큰 문자만 출력
print("(" + key + ", " + str(freq_count.get(key)) + ")")
myStr = 'Hello World. Let\'s learn Python'
calc_char_freq(myStr)코드 설명
Counter(string)이 호출되면 문자열 전체가 문자 단위로 분리되어 빈도 딕셔너리가 생성됩니다. 이후 for 반복문으로 각 키를 확인하면서, get(key)로 얻은 빈도 값이 1보다 클 경우에만 해당 문자와 개수를 화면에 출력합니다.
실행 결과
(e, 3) (l, 4) (o, 3) ( , 4) (r, 2) (t, 2) (n, 2)
결과를 보면 'l'과 공백(' ')이 각각 4번으로 가장 많이 등장했으며, 'e'와 'o'는 3번, 'r', 't', 'n'은 2번씩 나타난 것을 확인할 수 있습니다. 이처럼 Counter()를 활용하면 몇 줄의 코드만으로 문자열 내 중복 문자와 빈도를 손쉽게 분석할 수 있습니다.