문제
https://leetcode.com/problems/most-common-word/
문자열(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]
총평
아직 정규식과는 친하지 않은 것 같다. 몇 개 문제를 풀다 보면 익숙해지겠거니 한다.
그리고 역시 파이썬은 함수가 너무 짱짱한 것 같다. 파이썬 절대 잃을 수 없어...
'알고리즘 > 파이썬 알고리즘 인터뷰' 카테고리의 다른 글
슬라이딩 윈도우 (0) | 2022.06.07 |
---|---|
[LeetCode] 49. Group Anagrams (문자열 조작) (0) | 2022.06.02 |
[LeetCode] 937. Reorder Data in Log Files (문자열 조작) (0) | 2022.05.31 |
[LeetCode] 344. Reverse String (문자열 조작) (0) | 2022.05.31 |
[LeetCode] 125. Valid Palindrome (문자열 조작) (0) | 2022.05.30 |