본문 바로가기

알고리즘/파이썬 알고리즘 인터뷰

[LeetCode] 819. Most Common Word (문자열 조작)

문제

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

 

Most Common Word - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

문자열(paragraph)과 금지 단어 목록(banned)을 입력으로 받는다.

문자열 중에서 금지 단어가 아닌 가장 자주 사용된 단어를 소문자로 반환하자. 

 

내 풀이

시간 : 50ms

처음에 정규식을 사용하지 않고 문자열 처리 함수인 split() 만으로 해결하려고 했더니 잘 안되었다.

그래서 어쩔 수 없이 정규식을 사용하게 되었다.

1. 문자열을 전부 소문자로 만들고, "!?',;. "을 기준으로 분할한 리스트를 만들었다.

2. 딕셔너리를 사용하여 각 단어가 몇 번 출현하였는지 카운트를 세었다.

3. 딕셔너리를 value를 기준으로 내림차순으로 정렬하였다.

4. 정렬된 리스트(딕셔너리를 정렬하면 리스트로 반환된다)에서 금지 단어가 아니고 ''가 아닌 key를 반환하면 답이 된다.

 

import re

class Solution:
    def mostCommonWord(self, paragraph: str, banned: List[str]) -> str:
        paragraph = re.split("[!?',;. ]", paragraph.lower())
        
        dic = dict()
        for p in paragraph:
            if p in dic: dic[p] += 1
            else: dic[p] = 1
        dic = sorted(dic.items(), key=lambda x:-x[1])

        for d in dic:
            if d[0] not in banned and d[0] != '':
                return d[0]

 

다른 풀이

시간 : 65ms

정규식에서 \w는 단어 문자를 뜻하며, ^은 not을 의미한다.

re.sub("[^\w]", ' ', paragraph)는 단어 문자가 아닌 모든 문자를 공백으로 치환한다.

words = [word for word in re.sub("[^\w]", ' ', paragraph).lower().split() if word not in banned]을 풀어써보자 -> paragraph에서 단어 문자가 아닌 모든 문자("!?',;.")는 공백으로 치환하고, 그 후 전부 소문자로 만들고, 문장을 스페이스 기준으로 자른 리스트를 만들고 거기서 banned에 속하지 않는 단어만 words에 담는다.

collection.Counter(words)를 출력해보면 Counter({'ball': 2, 'bob': 1, 'a': 1, 'the': 1, 'flew': 1, 'far': 1, 'after': 1, 'it': 1, 'was': 1})와 같이 나온다. 

여기서 most_common(1)을 사용하여 최빈값 1개를 추출한다. ex) [('ball', 2)]

가장 자주 사용된 문자열을 반환하려면 [0][0] 요소에 접근하여 반환한다.

 

import re, collections

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

 

총평

아직 정규식과는 친하지 않은 것 같다. 몇 개 문제를 풀다 보면 익숙해지겠거니 한다. 

그리고 역시 파이썬은 함수가 너무 짱짱한 것 같다. 파이썬 절대 잃을 수 없어...