소소한 컴퓨터 이야기

가장 흔한 단어

by Cori

문제

금지된 단어를 제외한 가장 흔하게 등장하는 단어를 출력하라. 대소문자 구분을 하지 않으며, 구두점(마침표, 쉼표 등) 또한 무시한다.

 

· 입출력 예 

paragraph  "Bob hit a ball, the hit BALL flew far after it was hit."
banned  ["hit"]
return  "ball"

풀이

1. 리스트 컴프리헨션, Counter 객체 사용

def mostCommonWord(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]

입력값에는 대소문자가 섞여 있으며 쉼표 등 구두점이 존재하기 때문에, 정규식을 사용하여 단어 문자(\w)가 아닌 모든 문자를 공백으로 치환한다. (^ = not) 또한, not in 연산자를 통해 금지어에 포함되어 있지 않은 단어들을 대상으로 리스트를 만든다. 개수를 처리하는 부분은Counter 모듈을 사용하여 처리하였는데, Counter의 most_common(1)을 사용하여 가장 흔하게 등장하는 단어의 첫 번째 값을 추출할 경우[('ball', 2)]와 같은 형태로 추출된다. 따라서, 단어를 반환하기 위해 counts.most_common(1)[0][0]과 같은 형태로 작성한다.

 

* counts = collections.Counter(words) 이후 부분은 다음과 같이 작성할 수 있다.

counts = collctions.defaultdict(int)
for word in words:
    counts[word] += 1 

return max(counts, key=counts.get)

defaultdict를 통해 int 값이 자동으로 부여되게 하였고, 이로써 키 존재 유무를 확인할 필요 없이 couts[word] += 1을 수행할 수 있다. max 함수에 key를 지정해 주어 counts에서 값이 가장 큰 키를 가져온다.


Info

1. collections.defaultdict(int) 

-> 딕셔너리에 int 값이 자동으로 부여되게 할 수 있으며, 키 값이 없어도 오류가 발생하지 않는다.

2. Counter 변수.most_common(1) 

-> Counter 객체의 most_common(n)을 통해 최빈값 n개를 가져올 수 있다.

3. not in 연산자를 통해 금지어를 쉽게 피할 수 있다.

4. 정규식에서 \w는 단어 문자를 뜻하며, ^는 not을 의미한다.

'CS > Coding Test' 카테고리의 다른 글

그룹 애너그램  (0) 2021.09.30
전화번호 목록  (0) 2021.09.29
로그 파일 재정렬  (0) 2021.09.28
타겟 넘버  (0) 2021.09.27
바이러스  (0) 2021.09.27

블로그의 정보

코딩하는 오리

Cori

활동하기