Algorithms/LeetCode

LeetCode #819 Most Common Word

8iggy 2021. 4. 24. 17:36

읽기 전

  • 불필요한 코드나 잘못 작성된 내용에 대한 지적은 언제나 환영합니다.
  • 개인적으로 배운 점을 정리한 글입니다.

문제 링크

LeetCode #819 Most Common Word

문제 풀이

알파벳을 제외한 나머지 문자들은 모두 ' '(공백)으로 치환한다. 그리고 공백으로 분리된 문자열을 list화하여 각 단어들에 대해 banned에 들어있지 않다면 개수를 체크하여 가장 큰 값을 가진 단어를 return하면 된다.

python 코드 - 1

class Solution:
    def mostCommonWord(self, paragraph: str, banned: List[str]) -> str:
        check = collections.defaultdict(int) # 귀찮으므로 defaultdict 생성
        paragraph = paragraph.lower() # 대문자를 모두 소문자로 치환
        paragraph = re.sub('[^\w]', ' ', paragraph) # 알파벳이 아니면 모두 공백
        for item in paragraph.split(): # 공백으로 분리된 단어들에 대해
            if item not in banned: # ban되지 않은 단어라면
                check[item] += 1 # dict에 삽입
        sol = list(check.items()) # 삽입된 item들을 list화 (List[tuple]형임)
        sol.sort(key=lambda x: x[1], reverse=True) # 개수를 기준으로 '내림차순' 정렬
        return sol[0][0] # 가장 앞의 값에 대해 단어 반환

python 코드 - 2

iterable 객체의 요소 count를 다룰 때 치트키 수준으로 사기적인 기능이 Counter 객체이다. 가급적 코테에서만 사용하고 면접에서는 면접관께 선질문을 해서 확인하는 게 좋다 생각한다. 그정도로 기능이 너무 강력하다.

class Solution:
    def mostCommonWord(self, paragraph: str, banned: List[str]) -> str:
        '''
        list comprehension으로 알파벳이 아닌 문자들을 공백으로 치환한 문자열을
        소문자로 다시 치환한 뒤 split으로 공백을 분리한다.
        그리고 추가하기 전 banned에 등록된 단어인지 체크한다.
        '''

        paragraph = [word for word in re.sub('[^\w]', ' ', paragraph)
                     .lower().split() if word not in banned]
        check = collections.Counter(paragraph) # list iterable 객체를 Counter에 넣는다.
        '''
        Counter.most_common 함수는 개수 순서대로 내림차순 정렬한다.
        인자 값은 그 뒤의 값에 대해 drop함을 의미한다.
        반환형태는 List[tuple]이므로 값 접근을 위해 두 개의 index 필요
        '''
        return check.most_common(1)[0][0]