본문 바로가기
IT/알고리즘

[Leetcode]819. Most Common Word

by 어센트 2020. 9. 18.
 

819. Most Common Word

 

개인적으로 까다로운 문제였다. 처음에는 단순히 paragraph의 특수문자와 2칸이상인 공백들을 1칸으로 바꿔주는 방식으로 문제를 풀려고 했는데 의외로 까다로운 점이 많았다.

 

풀이

  1. paragraph을 모두 소문자로 변경 후 끝에 공백추가(단어별로 나누어 리스트로 반환하기위해 공백을 추가했다.)
  1. 문자열을 순회하면서
    1. 현위치가 알파벳 and 다음 위치 알파벳이 아닌 경우
    1. 현위치가 알파벳 아닌경우 and 다음위치가 알파벳인 경우

    2가지로 나눠서 시작점과 끝점을 설정하고 단어로 끊어서 만들어 놓은 리스트에 넣어주었다.

     

  1. 그리고 딕셔너리를 이용해 banned에 포함되어있지 않은 단어들을 계속 넣어주었다.
  1. 딕셔너리 순회 후 가장 value가 큰 key를 리턴

 

내 풀이

class Solution(object):
    def mostCommonWord(self,paragraph,banned):
        word = []
        paragraph = paragraph.lower()
        paragraph+=" "
        idx = 0
        for i in range(len(paragraph)-1):

            if paragraph[i].isalpha() and  not paragraph[i+1].isalpha():
                word.append(paragraph[idx:i+1])
            elif not paragraph[i].isalpha() and paragraph[i+1].isalpha():
                idx = i+1

        
        dic = {}
        for w in word:
            if w not in banned:
                if dic.get(w) is None:
                    dic[w] = 1
                else:
                    dic[w]+=1
        
        frq = 0
        ans = ""
        for key,val in dic.items():
            if frq < val:
                frq = val
                ans = key

        return ans

 

 

정규표현식을 이용한 풀이

정규식에서 \w는 문자 , ^는 not을 의미한다.

 

collections를 이용해 개수를 담아두는 변수 딕셔너리를 사용한다

 

배운 뒤 풀이

import re
import collections
from typing import List
class Solution2:
    def mostCommonWord2(self, paragraph: str, banned: List[str]) -> str:

        words = [word for word in re.sub(r'[^\w]',' ',paragraph).lower().split() 
                if word not in banned ]
        counts = collections.Counter(words)
        return counts.most_common(1)[0][0]

 

훨씬 간결하다.