본문 바로가기

개발/Algorithm

[리트코드] Most Common Word(python)

리트코드, Most Common Word_가장 많이 등장한 단어 찾기

 

TL;DR

  • 주어진 문자열을 조건에 맞게 처리할 수 있는지

문제 분석

1. 문자열 집합인 paragraph와 금지된 단어인 banned가 주어졌을 때 금지되지 않은, 가장 많이 등장한 단어를 반환한다.
2. 최소 1개의 단어는 금지되며, 정답은 단 하나인 것이 보장된다.
3. paragraph에 있는 단어는 소문자 형태로 반환되어야 한다.

- 1 : 해결해야 하는 문제에 대해서 설명하고 있다.

- 2 : 문제의 자체적인 제한조건에 대해서 설명하고 있다.

- 3 : 반환 시 주의해야 할 점에 대해서 설명하고 있다. 대소문자 구분 없이 소문자 형태로 출력해야 하며, 쉼표(,)와 같은 표현들은 제외되어야 한다.

입출력 형태

입출력 예시

 

- 예시 1번

  - 문장이 paragraph의 형태로 주어지고, 그 중 금지 단어 배열인 banned가 주어진다.

  - 문장에서 hit을 제외하고 가장 많이 등장한 단어를 반환하면 된다.

  - 문장에는 hit을 제외하면 Bob a ball the BALL flew far after it was가 남게 된다.

  - 이 중 가장 많이 등장한 단어는 ball로 ball, BALL 총 2회 등장한다.

- 예시 2번

  - 예시에서 주어진 단어는 a가 유일하고, 금지된 단어는 존재하지 않는다.

  - 따라서 가장 많이 등장한 유일한 단어인 a를 반환한다.

풀이

class Solution:
    def mostCommonWord(self, paragraph: str, banned: List[str]) -> str:
    	# 주어진 paragraph에서 알파벳이 아닌 문자들을 제거하고, 소문자로 변환한다.
        # 그리고 banned에 있지 않은 단어로 새로운 단어 배열을 만든다.
        words = [word for word in re.sub('[^\w]', ' ', paragraph).lower().split() 
        	if word not in banned]
        
        # Counter 객체를 통해 배열 내에 존재하는 단어들의 횟수를 센다.
        counts = Counter(words)
        # most_common 메소드를 통해 가장 많이 등장한(1) 단어를 반환한다.
        return counts.most_common(1)[0][0]

 

- 리스트 컴프리헨션(List comprehension)을 통해 주어진 paragraph에서 원하는 문자열만을 배열에 저장한다.

  - `re.sub('[^\w]', ' ', paragraph).lower().split()`

      - 주어진 문자열 paragraph에서 특수문자(\w)를 공백으로 치환한 문자열을 반환한다.

      - 예시 1번의 입력인 "Bob hit a ball, the hit BALL flew far after it was hit."이 이 구문을 거치게 되면 "Bob hit a ball the hit BALL flew far after it was hit"이 된다.

      - 이 문자열이 lower()을 통해 소문자로 변환된다. 그럼 문자열은 "bob hit a ball the hit ball flew far after it was hit"이 된다.

      - 소문자로 변환된 문자열은 split()을 통해 공백문자를 기준으로 각 단어별로 나눠진 리스트의 형태가 된다. 이 구문을 통해 최종적으로 ['bob', 'hit', 'a', 'ball', 'the', 'hit', 'ball', 'flew', 'far', 'after', 'it', 'was', 'hit]이 된다.

 

- word는 리스트에 존재하는 각각의 단어로, 새로 만든 리스트인 words에 저장된다. 단, 이 때 `if word not in banned` 구문에 의해 금지 단어에 있지 않은 word만 words에 저장된다.

  - 이 구문을 통해 예시 1번에서는 ['bob', 'a', 'ball', 'the', 'ball', 'flew', 'far', 'after', 'it', 'was']가 저장되게 된다.

 

- Counter 객체는 리스트 내에 존재하는 아이템들의 개수를 세서 반환한다.

- Counter 객체의 most_common(`조회를 원하는 순위`) 메소드를 통해 원하는 순위까지 아이템을 조회할 수 있다. 이 문제에서 가장 많이 등장한 단어만을 원하기 때문에 `counts.most_common(1)`을 사용한다.

- counts.most_common(1)의 출력형태는 리스트로 [('ball', 2)]와 같이 출력된다. 즉, (가장 많은 아이템, 해당 아이템의 개수) 형태를 띄게 된다.

- 원하는 반환은 가장 많이 등장한 아이템이므로 counts.most_common(1)[0][0]을 반환한다.

반응형