collections 모듈의 Counter 클래스
Counter : 파이썬 내장 클래스 중 하나
주어진 iterable 내의 요소 개수를 세는 데 사용됨
dictionary와 비슷하게 동작하지만, 요소의 개수를 자동으로 세어줌
- 주요기능 : 요소개수 세기, 사전 메소드 지원(keys(), values(), items()),
간단한 연산지원(덧셈, 뺄셈, 교집합, 합집합 등)
- 리스트를 이용한 예제
fruits = ['apple','banana','orange','apple','apple']
Counter(fruits)
=> _결과 : Counter({'apple':3,'banana':1,'orange':1})
- 문자열을 이용한 예제
text = "apple"
Counter(text)
=> 결과 : Counter({'p':2,'a':1,'l':1,'e':1})
- 주요메서드 : 요소를 개수만큼 반복해서 반환 elements()
가장 흔한 요소를 개수와 함께 반환 'n'을 지정하면 'n'개의 요소만큼 반환 most_common([n])
Counter에서 다른 Counter나 iterable의 요소 개수를 뺌 subtract(iterable or mapping)
- elements() 메소드 예제
counter = Counter(a=3, b=1)
list(counter.elements())
=> 결과 : ['a','a','a','b']
- most_common() 메소드 예제
counter = Counter('abracadabra')
counter.most_common(2)
=> 결과 : [('a',5),('b',2)]
counter.most_common(3)
=> 결과 : [('a',5),('b',2),('r',2)]
- Counter 객체 간의 연산
counter1 = Counter(a=4, b=2, c=0, d=-2)
counter2 = Counter(a=1, b=2, c=3, d=0)
- 덧셈 counter1 + counter2 => Counter({'a': 5, 'b': 4, 'c': 3})
- 뺄셈 counter1 - counter2 => Counter({'a': 3})
- 교집합(최소값) counter1 & counter2 => Counter({'b': 2, 'a': 1})
- 합집합(최대값) counter1 | counter2 => Counter({'a': 4, 'c': 3, 'b': 2})
마라톤에 참여한 선수들의 명단이 주어지고, 완주한 선수들의 명단이 주어질 때,
완주하지 못 한 선수의 이름을 return 하되 동명이인이 있을 수 있다.
나는 for문과 if문을 통해 문제를 해결하려고 시도했지만 동명이인 문제에서 실패하였다.
원인 : 참가자 중 한 명이 동명이인일 경우, 단순히 'in' 연산자를 사용하여 존재 여부를 확인하는 것은 올바르지 않다.
챗 GPT의 도움을 받아 Counter 클래스를 활용하게되었다.
Counter 클래스의 사용법과 시간복잡도를 알게되었다.
각 리스트에 대해 O(N) 시간이 걸리며, 리스트의 차이를 계산하는 것도 O(N)시간이 소요된다.
따라서 위 코드의 알고리즘은 전체 O(N) 시간 복잡도를 가지게 되며, 매우 효율적이다.