python의 Collections에는 자주 쓰일 법한 유용한 자료 구조들이 있습니다. 파이썬의 Queue 대신에 쓸 수 있는 deque도 있습니다. 이것은 다음에 언급하도록 하고요. 이 중에서 이번 시간에는 Counter를 어떻게 쓰는지 간단하게 알아보도록 하겠습니다.

 


 먼저 예제 1번을 보겠습니다.

 

 

 3번째 줄에서, cs[1] += 2가 있습니다. 이는, 키 1이 나오는 빈도를 2만큼 증가시킨다는 의미입니다. 4번째 줄에 cs[1]이 있는데요. 이는 키 1의 빈도를 가져옵니다. 2가 되겠네요. 다음에 5번째 줄에서는 cs.pop(1)이 있는데요. 이는 키 1을 제거한다는 의미입니다.

 

 이전에 key 값이 1이고, v가 2인 정보가 있었어요. 키 1을 pop 메서드로 제거하면, 이 정보가 사라집니다.

 

 

 그러면, 아래와 같이 바뀝니다. 그리고 나서 cs[1]을 다시 출력하는데요. 키 1이 없으므로, 0을 출력하게 됩니다. 디버그를 돌려보면, 아래와 같은 method를 돌리게 되는데요.

 

 키가 없는 경우에 __missing__ 이라는 것이 내부적으로 호출되고, 해당 메서드가 0을 리턴하게 됩니다. 다음에, 전체 key 값을 순회하기 위해서는 for loop로 돌리면 됩니다. 이는 예제의 9 ~ 10번째 줄에서 수행하고 있습니다.

 

 1, 2가 추가로 출력되었는데요. 이는, 1을 제거하고 나서 다시 키 값 1, 2를 다시 넣었기 때문입니다.

 


 이제, 예제를 하나 더 보겠습니다.

 

 입력받은 단어에서 모음의 개수를 세려고 합니다. 어떻게 하면 될까요? string도 iterable 하니, Counter의 생성자로 넣어버리면 됩니다. A에는 어떻게 들어갈까요? 해당 문자가 나온 횟수를 들고 있어요. 예를 들어서 h는 2번 나왔고, c는 1번 나왔다는 정보 등이 들어가 있습니다.

 

 

 요래 들어가 있습니다. 이제 이것을 적절하게 잘 이용하면 되는데요. 자음보다 모음의 갯수가 압도적으로 적으니, "AEIOUaeiou" 문자열을 만들어서 판단해 봅시다. 저 문자열 내에서 순회 하면서요.

 

 4번째 줄이 그러한 일을 수행합니다. 5번째 줄은 A[ch]를 더했는데요. 이는 키가 없으면 0을 리턴하게 하기 위함입니다.

 

 

 결과는 4가 나옵니다. o, a, u, i 이렇게 4번 나왔으니 4가 맞습니다.

 

 get 메서드를 쓰면, 키가 없는 경우에 None이 나와 버립니다. 이 때문에, 예외가 발생할 수 있어요. None type과 3을 더할 수는 없습니다. 이 예외를 회피하려면, A.get(ch)가 None 타입이 아닌 경우에만 더하는 연산을 수행해야 할 겁니다.

 

 예외는 항상 무서운 법이기 때문입니다. C++ STL에 multimap이 있다면, 파이썬에는 Counter가 있어요. 백준에서 많이 쓸 만한 메서드 위주로 포스팅 하였으니, 잘 익히시면 좋을 듯 싶습니다.