알고리즘 문제풀이_Leet Code #819

문제 설명

문제링크

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

문제해설

  • 문자열paragraph와 리스트 banned 두개의 인자가 주어진다.
  • paragraph단어별로 나눈 후 banned안에 있는 단어를 뺀 것 중 가장 많은 빈도로 사용된 단어를 반환해야 한다.
  • 문장은 영문자, 공백,"!?',;."의 특수문자가 포함될 수 있다.
  • banned에는 소문자만 들어있다.
  • 대소문자를 구분하지 않는다.

문제 풀이

풀이과정

  1. 문장을 깔끔하게 만든다.
    • 특수문자를 공백으로 바꾸고
    • 공백을 기준으로 단어들의 리스트로 나눈다.
  2. collections 모듈의 Counter가 제공하는 most_common() 메서드를 활용해 가장 빈도가 높은 단어를 뽑는다.
  3. 뽑은 단어를 반환한다.

나의풀이

from collections import Counter
import re
        

class Solution:
    def mostCommonWord(self, paragraph: str, banned: List[str]) -> str:
    	# 특수문자 <-> 공백으로 엮는 테이블 생성
        word_table = str.maketrans("!?',;.", "      ")
        # 소문자 처리한 paragraph를 위에서 만든 테이블로 번역(?) -> 특수문자가 공백으로 변함
        cleand_word = paragraph.lower().translate(word_table)
        # 단어별로 나누기
        word_list = cleand_word.split()
        
        # Counter 객체에 담아, 가장 인기 많은 Count의 (0번인덱스) 단어 (0번인덱스) 를 반환한다.
        return Counter([word for word in word_list if word not in banned]).most_common()[0][0]
  • 정규표현식보다는 maketrans를 사용해서 좀 더 직관적이게 문자열을 처리했다.
  • 정규표현식을 사용하려면 cleand_wrod = re.sub(r'[^\w]', ' ', paragraph.lower()) 이렇게 처리할 수도 있다. \w는 단어를 뜻하고 ^는 반대의 값을 뜻하기 때문에, 단어가 아닌 모든 것을 ' '로 (즉, 공백으로) 바꾸겠다는 뜻이다.
  • 무튼 정규표현식을 안써도 처리가 되는것은 굳이 안쓰고 처리하는게 더 직관적이고 쉽고 빠를 수 있기 때문에 정규식을 쓰지 않았는데, 익혀두긴 해야할 것 같다.
  • Counter 나 List Comprehension은 따로 설명하지 않겠다!!

좋은 웹페이지 즐겨찾기