* 해당 포스트는 <파이썬 알고리즘 인터뷰> 공부 후 정리 목적으로 작성되었습니다. *

 

leetcode 819번 ( https://leetcode.com/problems/most-common-word/ )

 

풀이방법 1. 

리스트 컴프리헨션(list comprehension)과 Counter 자료구조를 사용한다. 

 

list comprehension

list comprehension이란 기존에 있는 리스트의 값을 사용해서 새로운 리스트를 만드는 것이다. 

우선 주어진 문자열을 대소문자로 변환하고 특수문자를 제거한 뒤, 문자열 리스트로 만드는 작업이 필요하다. 

그 이후에는 각 문자열이 banned_list에 있는 문자열이 아닌지를 확인해서 리스트에 추가 및 정렬하는 작업이 필요하다. 

 

list comprehension을 통해서 간단한 코드로 주어진 문자열을 조건에 맞는 문자열 리스트로 만들 수 있다. 

lists = [elem for elem in re.sub(r"[\W]", " ", string).lower().split() if elem not in banned_list]

 

해당 코드에서는 string의 문자 중 영문자가 아닌 문자들은 전부 공백으로 바꾸고, 모든 문자열을 소문자로 바꾼다. 이후 공백을 기준으로 나눠서 단어 리스트를 리턴한 뒤, 리스트 안의 각 단어가 banned_list에 없다면 lists에 추가하는 형태로 새 리스트를 만든다. 

 

lower() : 기본으로 제공되는 메소드로, 문자열의 모든 대문자를 소문자로 바꾼다. 

split(sep) : 문자열을 sep(문자)를 기준으로 나눠서 리스트 형태로 리턴한다. sep가 없을 경우 공백으로 나눈다. 

 

re.sub()에서 d, w, W 등 특정 문자는 \와 결합될 경우 단순 알파벳이 아니라 포괄적인 의미로 사용된다. 

\d : 모든 숫자

\w : 모든 영문자

\W : 영문자가 아닌 모든 문자(\w의 반대)

 

counter

Counter 객체는 dictionary의 하위 클래스이며 collections 라이브러리를 통해 사용할 수 있다.

dictionary 클래스를 상속받아서 대부분의 기능은 유사하지만, 몇 가지의 차이점이 있다. 

words = ["hi", "hello", "heee"]
counter = collections.Counter(words)

 

Counter 객체를 초기화할 때 매개변수로 리스트를 받을 수 있다. 그러면 리스트 내부의 각 단어가 key, 해당 단어의 등장 빈도 수가 value로 저장된다. 즉 단어 리스트를 Counter의 매개변수로 넣은 뒤 특정 단어의 value 값을 조회하면 해당 단어가 몇 번 등장했는지를 알 수 있다. 

 

또한 기존의 dictionary는 찾는 단어(key)가 없을 경우 ValueError을 발생시켰지만 collections.defaultdict()은 None을, collections.Counter()은 0을 리턴한다. 

 

또한 Counter의 most_common(n) 메소드를 사용하면 빈도수가 가장 높은 단어를 최대 n쌍 반환한다. 리스트 형태로 반환하며, 각 원소는 tuple 형태이다.

이를 이용해서 가장 빈도수가 높은 단어 하나를 리턴할 수 있다. 

return counter.most_common(1)[0][0]

 

 

참고한 포스트

https://docs.python.org/3/library/collections.html#collections.Counter

https://www.w3schools.com/python/python_lists_comprehension.asp

 

 

 

+ Recent posts