[leetcode 819] Most Common Word

wlgns2223·2021년 5월 3일
0

leetcode

목록 보기
1/21

Most Common Word

코테 언어를 C++에서 파이썬으로 바꿨는데 이런 문자열 조작은 확실히 파이썬이 좋은거 같다.

나의 논리

우선 WA를 받았다.

class Solution:
    def mostCommonWord(self, paragraph: str, banned: List[str]) -> str:
        
        delimeters = "!?',;."
        splited_paragraph = paragraph.split()
        for index, word in enumerate(splited_paragraph):
            splited_paragraph[index] =
            ''.join(char for char in word 
            if char not in delimeters).lower()
            
        max_count, max_word = 0, ""
        for index, word in enumerate(splited_paragraph):
            if word in banned:
                continue
                
            temp = splited_paragraph.count(word)
            
            if temp > max_count:
                max_count = temp
                max_word = word
                
        return max_word
        

여전히 코드에 C++ 스타일이 가득한거 같다. 이 부분은 차차 바꿔가야지.

먼저 문장을 공백으로 나누어 리스트로 나눈다.
그 후 각 공백으로 나누어진 리스트들의 원소인 나누어진 문자열에 대하여, 그 문자열에 구분자들이 있으면 그냥 지운다.

그 후 나누어진 리스트들을 순회하면서 list.count()를 사용하여 가장 많이 등장한 단어를 찾고 그 단어를 반환한다.

내 코드의 문제점은 구분자가 나오면 그것도 구분자에 대해서도 분리해야하는데 그냥 패스하고 이어붙여서 이어붙인 문자열을 만들었다.

정답논리

def mostCommonWord(self, paragraph: str, banned: List[str]) -> str:
        
        p = [ word for word in re.sub(r'[^\w]',' ',paragraph)
        .lower().split() if word not in banned]
        
        counts = collections.Counter(p)
        return counts.most_common(1)[0][0]

정규표현식을 통해 아주 간단하게 해결 했다.

https://velog.io/@ednadev/파이썬-정규표현식과-re모듈 님의 블로그를 간단하게 참고했다.

re.sub(r'[^\w]',' ',paragraph)

는 정규표현식을 이용해 주어진 문자열 (paragraph)에서
일치하는 패턴( [^\w])을 찾아내어 공백으로 치환한다

예를 들어
"a, a, a, a, b,b,b,c, c" -> "a a a a b b b c c"로 변한다.

lower()로 소문자로 바꾼뒤, 파라미터 없이 split호출하면 공백으로 나누는 것을 이용해 split 호출 한다.

Counter 함수는 아래 블로그를 참조했다.
https://www.daleseo.com/python-collections-counter/

리스트,셋, 문자열을 넘기면 원소들의 갯수를 세어 딕셔너리 형태로 원소와 갯수를 리턴해준다.

그리고 가장 많이 등장한 원소 순서대로 정렬된 배열을 리턴하는

counter.most_common()

도 있다.

입력문자열이 "a, a, a, a, b,b,b,c, c"이고 banned 문자가 'a'일때

리턴값은

[('b',3),('c',2')]

이다. 그 중 첫번째 원소 ('b',3)의 첫번째 원소 'b'를 리턴하면 된다.

profile
유연한 개발자

0개의 댓글