[LeetCode] 819. Most Common Word 파이썬 풀이

헬리코박도·2021년 12월 2일
0
post-thumbnail

https://leetcode.com/problems/most-common-word/

문제 설명

주어진 문자열 paragraph에서 가장 많이 나온 단어를 찾는다.
이 때 banned라는 문자 배열이 주어지는데 banned에 있는 단어는 제외하고 가장 많이 나온 단어를 찾아 반환하는 문제이다.

이 때 최소한 한 단어는 ban 당하지 않으며 빈도가 동일한 것 없이 가장 많이 나온 단어는 단 하나라는 조건이 있다.

또 주어진 paragraph는 대소문자를 구분하지 않으며(case-insensitive), 결과는 소문자로만 반환되어야 한다.

코드 구현

일단 생각나는 아이디어로는 125번 문제풀이에서 했던 것처럼 lower()와 정규표현식을 사용해서 소문자만 남겨주는 것이다.

그리고 ban 당한 단어를 제외하고 빈도를 세주는데 간단하게 생각나는 건 딕셔너리와 max()를 이용해서 짜는 것이다. 그리고 책에서 collections의 Counter와 most_common 메소드를 사용했던 것도 기억에 난다. collections 라이브러리도 리트코드에 기본적으로 import 되어 있다.

ban 당한 단어인지 확인하는 건 파이썬에 in 연산자가 있으니 그걸 사용해주면 될 것 같다.

딕셔너리와 max

class Solution:
    def mostCommonWord(self, paragraph: str, banned: List[str]) -> str:
        count = {}
        paragraph = re.sub("[^a-z]", " ", paragraph.lower())
        
        for word in paragraph.split():
            if word in banned:
                continue
            
            if word not in count:
                count[word] = 0
            else:
                count[word] += 1
                
        return max(count, key = count.get)

소문자로 변경한 후 정규표현식으로 알파벳 소문자 아닌 기호들은 공백으로 바꾸어 준다.

한 번도 센 적 없는 단어면 딕셔너리에서 해당 단어를 키로 값을 0으로 초기화 해주고 센 적 있다면 카운트를 하나 씩 증가시킨다.

이 때 파이썬 기본 딕셔너리가 아닌 collections의 defaultdict를 사용한다면 0으로 초기화하는 부분을 생략할 수 있다. 왜냐면 defaultdict는 자동으로 0으로 초기화 되어 있기 때문이다.

max는 sort 때와 마찬가지로 정렬 기준을 패러미터로 줄 수 있다. 파이썬 딕셔너리의 get 메소드는 key값으로 value를 가져오는 메소드이다. 따라서 이 경우 value인 카운트 된 단어 출현 빈도 수가 정렬 기준이 된다.

Counter의 most_common

collections 모듈에는 Counter 클래스가 있는데 자동으로 배열의 원소를 세서 딕셔너리 형태로 반환해준다. 그리고 Counter 클래스에는 most_common이라는 메소드가 있어서 빈도가 높은 순서대로 (원소, 빈도 수) 튜플로 묶어 저장된 리스트를 반환해준다.

class Solution:
    def mostCommonWord(self, paragraph: str, banned: List[str]) -> str:
        words = [word for word in re.sub("[^a-z]", " ", paragraph.lower()).split() if word not in banned]
        
        count = collections.Counter(words)
        
        return count.most_common(1)[0][0] 

most_common 메소드에 들어간 정수 1은 빈도 수 1위의(이 문제의 경우는 조건에 unique하다고 하였지만 원래라면 중복된 빈도를 가질 수 있다.) 튜플들의 리스트를 반환하라는 뜻이고 이 리스트에서 원소(단어)만 추출하기 위해 [0][0]으로 인덱싱을 해준다.

profile
Data Engineer

0개의 댓글