본문 바로가기

알고리즘 예시/Leetcode

[Python algorithm interview] List comprehension, 정규표현식, counter 객체 사용 예

320x100
파이썬 알고리즘 인터뷰의 2020ver을 리뷰하고 있습니다.

 

4. 가장 흔한 단어

 

리스트 컴프리헨션과 관련해서는 지난 파이썬 기초 글에서도 작성한 바가 있습니다.

파이썬_기초단계 알아보기_ep.3 만나려면 조건이 맞아야지 (tistory.com)

 

파이썬_기초단계 알아보기_ep.3 만나려면 조건이 맞아야지

ep.3 파이썬의 다양한 제어문 Python을 마스터하기 위한 3번째 계단 고지가 얼마 남지 않았습니다. 파이썬의 if, for, while문을 통해 제어문을 학습합니다. 인생의 많은 부분은 선택에 달려있습니다. "

astart.tistory.com

 

그 후부터 문제에서 적용한 예를 찾고 있었는데, 마침 있었네요.

일단 문제를 살펴보겠습니다.

 

🎈문제

 

금지된 단어를 제외한 가장 흔하게 등장하는 단어를 출력하라.

대소문자 구분을 하지 않으며 구두점(마침표, 쉼표 등) 또한 무시한다.

 

🔑입력 예제

 

paragraph = 'Bob hit a ball, the hit BALL flew far after it was hit.'
banned = ['hit']
'ball'

 

🛴 풀이법.

 

def mostCommonWord(paragraph : str, banned:list[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]

 

 

정답을 입력할때는 mostcommonwords("입력 문장", "금지할 문장")의 형식으로

입력하면 됩니다.


시작하기 전에, collections을 쓰게 됬네요. 먼저 라이브러리를 임포트해줍니다.

 

import collections
from collections import Counter

 

특별하게도, 머신러닝에서만 쓰이던 데이터 전처리(Data preprocessing)이 여기서도

필요하다고 합니다. 바로 정규표현식을 사용하는 것인데요?

정규표현식은 여기서 다루는 것에는 상당한 시간이 소요될 것 같아서 정규표현식 사이트와

HAMA 블로그 님의 링크 첨부로 갈음하겠습니다.

 

요컨대 파이썬에서 문자열을 치환하는 역할을 하는 기능입니다.

https://www.debuggex.com/

 

Debuggex: Online visual regex tester. JavaScript, Python, and PCRE.

View Cheatsheet Visual ModeText Mode {{nfaModel.error.msg}}   Result: Matches Does not match starting at the black triangle slider

www.debuggex.com

이해하기 쉽게 정규표현식을 그림으로 그려주는 사이트입니다.

 

a, d, t를 제외한 문자열

 

정규표현식 (Regex) 정리 (tistory.com)

 

정규표현식 (Regex) 정리

정규표현식은 아주 가끔 쓰기때문에 항상 다시 볼때마다 헷갈리곤 하기에 주요 사용예를 내가 나중에 다시 봤을 때 편하도록 정리하여 보았다. 정규 표현식의 용어들정규 표현식에서 사용되는

hamait.tistory.com

 

만약 jupyter notebook이나 정규표현식 모듈이 깔려 있지 않은 파이썬을 사용하신다면

re 모듈을 임포트해야 합니다.

 

import re
words = [word for word in re.sub(r'[^\w]', ' ', paragraph)
      .lower().split()
         if word not in banned]

# \w는 word character를 뜻하고 ^는 not을 뜻합니다.

 

단어문자가 아닌 모든 문자를 공백으로 치환하는 역할을 합니다.

 

단어의 갯수는 아래를 통해 확인할 수 있습니다.

counts = collections.defaultdict(int)
for word in words:
    counts[word] += 1

 

자. Counter를 사용하면 해당 요소안에서 갯수를 세줄수 있습니다.

추가적으로, counts.most_common()을 사용하면 가장 빈출되는 단어를 세주는 기능이 있습니다.

 

▼타 블로그 참조

파이썬 collections 모듈의 Counter 사용법 | Engineering Blog by Dale Seo

 

파이썬 collections 모듈의 Counter 사용법

Engineering Blog by Dale Seo

www.daleseo.com

 

def mostCommonWord(paragraph : str, banned:list[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]

 

mostCommonWord로 함수를 정의했습니다.

풀이 완.

728x90