본문 바로가기
파이썬 관련 문법

Counter 클래스: 코딩 테스트를 위한 효율적인 요소 빈도 계산 도구

by arctis7p 2024. 12. 11.

코딩 테스트 문제를 풀다 보면 문자열이나 배열의 요소 빈도 계산에 Counter라는 collections 모듈의 클래스를 사용하는 경우를 종종 확인할 수 있습니다.

 

Counter 클래스의 주요 특징과 사용법에 대해 알아보도록 하겠습니다.

 

  1. 생성 예시 및 설명
    from collections import Counter
    
    # 문자열로부터 생성
    c1 = Counter('gallahad')
    print(c1)  # Counter({'a': 3, 'l': 2, 'g': 1, 'h': 1, 'd': 1})
    
    # 리스트로부터 생성
    c2 = Counter(['red', 'blue', 'red', 'green', 'blue', 'blue'])
    print(c2)  # Counter({'blue': 3, 'red': 2, 'green': 1})
    
    # 딕셔너리로부터 생성
    c3 = Counter({'red': 4, 'blue': 2})
    print(c3)  # Counter({'red': 4, 'blue': 2})
    
    # 키워드 인자로 생성
    c4 = Counter(cats=4, dogs=8)
    print(c4)  # Counter({'dogs': 8, 'cats': 4})
    • collections 모듈은 실제로 Python의 내장 모듈입니다. 따라서 Counter 클래스도 Python에 내장되어 있습니다.
      정확히 설명하자면:
      • collections는 Python의 내장 모듈입니다.
      • Counter는 이 내장 모듈의 일부입니다.
      • 그러나 Counter는 list, dict, str 등과 같은 내장 타입(built-in types)과는 다릅니다.
        내장 모듈인 collections에 포함되어 있기 때문에, Python을 설치할 때 Counter도 함께 설치됩니다. 따라서 별도의 설치 과정 없이 사용할 수 있습니다.

        다만, Counter를 사용하기 위해서는 여전히 from collections import Counter와 같은 import 문이 필요합니다.
    • 생성되는 결과를 보면 키-쌍 값을 가지는 딕셔너리형과 같다는 것을 알 수 있습니다.
      이는 Counter가 dict를 상속받은 서브클래스이기 때문입니다. 다음은 Counter 객체의 주요 특징입니다.
      • 딕셔너리와 유사한 구조: 키-값 쌍을 가집니다.
      • 딕셔너리의 서브클래스이기 때문에 딕셔너리의 모든 기능을 가지면서 딕셔너리 메서드를 사용 가능합니다.
      • 또한, Counter는 딕셔너리의 기능을 확장하여 요소의 개수를 세는 데 특화된 추가 기능을 제공합니다.
        1. most_common() 메서드나 elements() 메서드 등은 Counter 클래스에서 추가로 제공하는 기능입니다.
      • 키는 세고자 하는 항목이고, 값은 그 항목의 개수입니다.
      • 존재하지 않는 키에 접근해도 KeyError를 발생시키지 않고 0을 반환합니다.
  2. 요소 접근 및 수정
    c = Counter(['eggs', 'ham'])
    print(c['bacon'])  # 0
    c['apple'] = 1
    print(c)  # Counter({'eggs': 1, 'ham': 1, 'apple': 1})
    • 앞서 설명했듯이, Counter 객체는 딕셔너리처럼 동작하며, 존재하지 않는 키에 대해 KeyError를 발생시키지 않고 0을 반환합니다.
  3. 가장 흔한 요소 찾기
    c = Counter('abracadabra')
    print(c.most_common(3))  # [('a', 5), ('b', 2), ('r', 2)]
    • most_common() 메서드는 Counter 클래스에서 추가로 제공하는 기능이라 설명했었습니다.
      주요 특징은 아래와 같습니다.
      • 요소와 그 개수를 (요소, 개수) 형태의 튜플 리스트로 반환합니다.
      • 기본적으로 개수가 많은 순서대로 정렬되어 반환합니다.
      • 개수가 같은 요소들의 순서는 처음 등장한 순서를 따릅니다.
      • 선택적으로 인자 n을 받아, 상위 n개의 가장 흔한 요소만 반환할 수 있습니다.
      • 인자를 지정하지 않거나, None을 전달하면 모든 요소를 반환합니다.
  4. 산술 연산
    c1 = Counter(a=3, b=1)
    c2 = Counter(a=1, b=2)
    print(c1 + c2)  # Counter({'a': 4, 'b': 3})
    print(c1 - c2)  # Counter({'a': 2})
    print(c1 & c2)  # Counter({'a': 1, 'b': 1})
    print(c1 | c2)  # Counter({'a': 3, 'b': 2})
    • Counter 객체들 간에 덧셈, 뺄셈, 교집합, 합집합 연산이 가능합니다.
  5. 요소의 총 개수
    c = Counter(a=4, b=2, c=0, d=-2)
    print(sum(c.values()))  # 4
    • sum() 함수를 사용하여 모든 요소의 개수 합을 구할 수 있습니다.
  6. 요소 제거
    c = Counter(a=4, b=2, c=0, d=-2)
    del c['a']
    c['b'] -= 1
    print(c)  # Counter({'b': 1, 'c': 0, 'd': -2})
    • 특정 요소를 제거하거나 개수를 줄일 수 있습니다.

 

이런 Counter 클래스는 코딩 테스트에서 문자열이나 리스트의 요소 빈도를 빠르게 계산해야 할 때 매우 유용합니다.

 

 

 

# 이 글의 내용 중 일부는 Perplexity AI의 도움을 받아 정보를 수집하고 정리하였으며, 추가적인 연구와 개인적인 견해를 더하였습니다.