Python 프로그래밍에서 문자열이나 리스트에 포함된 각 요소의 빈도(frequency)가 서로 동일한지 확인해야 하는 경우가 있습니다. 이럴 때는 collections 모듈의 Counter 클래스를 활용하면 매우 효율적으로 처리할 수 있습니다.
기본적인 접근 방식은 다음과 같습니다. 먼저 입력 데이터를 Counter로 변환하여 각 요소의 등장 횟수를 구합니다. 그다음 빈도 값들을 set(집합)으로 변환해 중복을 제거한 뒤 리스트로 만들고, 이 리스트의 길이를 기준으로 판별합니다. 결과는 콘솔에 출력됩니다.
예제 코드
from collections import Counter
def check_all_same(my_input):
my_dict = Counter(my_input)
input_2 = list(set(my_dict.values()))
if len(input_2)>2:
print('빈도가 같지 않습니다')
elif len(input_2)==2 and input_2[1]-input_2[0]>1:
print('빈도가 같지 않습니다')
else:
print('빈도가 같습니다')
my_str = 'xxxyyyzzzzzz'
print("입력 문자열 :")
print(my_str)
check_all_same(my_str)
실행 결과
입력 문자열 :
xxxyyyzzzzzz
빈도가 같지 않습니다
코드 설명
먼저 필요한 패키지인
collections모듈에서Counter클래스를 가져옵니다.하나의 입력값을 매개변수로 받는 함수
check_all_same을 정의합니다.입력 데이터를
Counter객체로 변환하여 변수에 할당합니다. Counter는 각 문자가 몇 번 나타나는지 자동으로 계산해 줍니다..values()메서드를 사용해 딕셔너리의 값(즉, 각 요소의 빈도)에 접근합니다.빈도 값들을
set으로 변환해 중복을 제거한 후 다시list로 변환하여 별도의 변수에 저장합니다.만약 고유한 빈도 값의 개수가 2보다 크다면, 세 가지 이상의 서로 다른 빈도가 존재한다는 의미이므로 빈도가 일치하지 않는 것입니다.
고유한 빈도 값이 정확히 2개인 경우에는 두 값의 차이를 확인합니다. 차이가 1보다 크면 빈도가 일치하지 않는 것으로 판단합니다(예: 한 요소의 빈도만 1개 더 많은 경우 허용).
그 외의 경우, 즉 고유한 빈도가 하나뿐이거나 차이가 1 이하라면 빈도가 동일하다고 출력합니다.
함수 외부에서 예시 문자열
'xxxyyyzzzzzz'를 정의하고, 이를 인자로 전달하며 함수를 호출합니다.최종 결과가 콘솔에 출력됩니다. 위 예제에서는 x가 3번, y가 3번, z가 6번 나타나므로 빈도가 같지 않다는 결과가 나옵니다.
이 방법은 시간 복잡도 O(n)으로 문자열을 한 번만 순회하면 되기 때문에, 대용량 데이터에서도 효율적으로 빈도 균형 여부를 검사할 수 있습니다.