819. Most Common Word
개인적으로 까다로운 문제였다. 처음에는 단순히 paragraph의 특수문자와 2칸이상인 공백들을 1칸으로 바꿔주는 방식으로 문제를 풀려고 했는데 의외로 까다로운 점이 많았다.
풀이
- paragraph을 모두 소문자로 변경 후 끝에 공백추가(단어별로 나누어 리스트로 반환하기위해 공백을 추가했다.)
- 문자열을 순회하면서
- 현위치가 알파벳 and 다음 위치 알파벳이 아닌 경우
- 현위치가 알파벳 아닌경우 and 다음위치가 알파벳인 경우
2가지로 나눠서 시작점과 끝점을 설정하고 단어로 끊어서 만들어 놓은 리스트에 넣어주었다.
- 그리고 딕셔너리를 이용해 banned에 포함되어있지 않은 단어들을 계속 넣어주었다.
- 딕셔너리 순회 후 가장 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]
훨씬 간결하다.
'IT > 알고리즘' 카테고리의 다른 글
[Leetcode]21. Merge Two Sorted Lists (1) | 2020.09.25 |
---|---|
[파이썬]코딩테스트를 위한 파이썬 자료형 (0) | 2020.09.19 |
[프로그래머스] 방금 그곡 lv2 (0) | 2020.09.03 |
프로그래머스 N개의 최소공배수 (0) | 2020.07.04 |
프로그래머스 피보나치 수 (python) (0) | 2020.06.24 |