이 글에서는 주어진 문자열에서 각 문자가 몇 번 등장하는지 그 빈도를 구하는 방법을 알아봅니다. 이어서 두 개 이상의 문자가 서로 같은 빈도를 가지는지, 즉 모든 문자의 빈도가 서로 다른지 여부까지 확인해 보겠습니다. 전체 과정은 두 단계로 진행되며, 첫 번째 프로그램에서는 각 문자의 빈도만 계산합니다.
각 문자의 빈도 구하기
먼저 입력 문자열에 포함된 각 문자의 등장 횟수를 계산합니다. 빈 딕셔너리(dictionary)를 하나 선언한 뒤, 문자열을 한 글자씩 순회하면서 해당 문자를 키(key)로 사용하고 등장 횟수를 값(value)으로 저장하는 방식입니다. 이미 존재하는 키라면 값을 1씩 증가시키고, 없다면 새로운 키-값 쌍을 추가합니다.
예제
in_string = "She sells sea shells"
dic1 = {}
for k in in_string:
if k in dic1.keys():
dic1[k]+=1
else:
dic1[k]=1
print(dic1)
for k in dic1.keys():
print(k, " repeats ",dic1[k]," time's")실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
{'S': 1, 'h': 2, 'e': 4, ' ': 3, 's': 5, 'l': 4, 'a': 1}
S repeats 1 time's
h repeats 2 time's
e repeats 4 time's
repeats 3 time's
s repeats 5 time's
l repeats 4 time's
a repeats 1 time's결과를 보면 'S'는 1번, 'h'는 2번, 'e'는 4번 등 각 문자별 등장 횟수가 딕셔너리 형태로 깔끔하게 정리됩니다. 공백 문자 역시 하나의 키로 처리된다는 점에 유의하세요.
각 문자의 빈도가 모두 고유한지 확인하기
이제 위 프로그램을 확장하여 문자열에 등장하는 빈도 값들 중 고유한(unique) 값이 몇 개인지 확인합니다. 집합(set)을 사용하면 중복을 제거한 빈도 목록을 손쉽게 얻을 수 있습니다. 만약 고유한 빈도 값이 하나뿐이라면 모든 문자의 빈도가 같다는 의미이고, 그렇지 않다면 최소 두 개 이상의 문자가 서로 다른 빈도를 가진다는 뜻입니다.
예제
in_string = "She sells sea shells"
dic1 = {}
for k in in_string:
if k in dic1.keys():
dic1[k]+=1
else:
dic1[k]=1
print(dic1)
u_value = set( val for udic in dic1 for val in (dic1.values()))
print("Number of Unique frequencies: ",len(u_value))
if len(u_value) == 1:
print("All character have same frequiency")
else:
print("The characters have different frequencies.")실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
{'S': 1, 'h': 2, 'e': 4, ' ': 3, 's': 5, 'l': 4, 'a': 1}
Number of Unique frequencies: 5
The characters have different frequencies.예제 문자열에서는 1, 2, 3, 4, 5처럼 총 5개의 서로 다른 빈도 값이 존재하므로 "문자들의 빈도가 서로 다릅니다"라는 메시지가 출력됩니다. 반대로 고유한 빈도의 개수가 1이라면 "모든 문자의 빈도가 같습니다"라는 결과를 얻게 됩니다.
참고: collections.Counter로 더 간결하게
파이썬에서는 표준 라이브러리의 collections.Counter를 활용하면 위의 반복문 없이도 문자 빈도를 한 줄로 계산할 수 있어 코드가 훨씬 간결해집니다.
from collections import Counter
in_string = "She sells sea shells"
counter = Counter(in_string)
print(counter)
unique_freq = set(counter.values())
if len(unique_freq) == 1:
print("All characters have the same frequency")
else:
print("Number of Unique frequencies: ", len(unique_freq))
print("The characters have different frequencies.")Counter는 문자열을 순회하며 자동으로 각 문자의 개수를 세어 주므로, 실무에서는 이 방식을 사용하는 것이 가독성과 성능 면에서 모두 유리합니다.