Python 알고리즘 인터뷰 - 문제4 가장 흔한 단어

2024. 1. 18. 09:28코딩 테스트/파이썬 알고리즘 인터뷰

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

 

예제

[예제1]

입력

paragraph = 'Bob hit a ball, the hit BALL flew after was hit.'

banned = ['hit']

 

출력

'ball'

 

풀이

 

데이터 클리닝 작업을 먼저 진행한다. ',' 문자를 ' ' 공백문자로 치환한다. 치환은 re 모듈을 사용한다.

s = re.sub('[^\w]', ' ', s)

 

대소문자를 가리지 않으므로 lower 함수 호출하여 소문자로 치환한다.

s = s.lower()

 

해당 문자를 split한 후 리스트에서 금지된 문자를 제거한다. python의 리스트 컴프리션을 사용하면 간단히 처리할 수 있다. split된 리스트의 각 문자 중 banned에 포함되지 않은 문자열만 리스트에 추가되었다.

words = [word for word in s.split() if word not in banned]

 

위의 코드는 다음과 같이 한줄로 표현할 수 있다.

words = [word for word in 
	s.re.sub('[^\w]', ' ', s).lower().split()
	if word not in banned]

 

생성된 리스트 중 가장 흔하게 존재하는 값을 구하기 위해 collections.Counter 클래스를 사용한다. Counter는 전달받은 리스트를 {리스트값 : key, 개수 : value} pair로 저장하는 딕셔너리이다.

counters = collections.Counter(words)

 

이후 most_common(1)을 호출하면 가장 value가 큰 값을 list[tuple[_T, int]] 포맷으로 호출한다. 예를 들어 [(ball, 2)] 형태로 호출한다. 단어만 추출하면 되므로 반환 값의 most_common(1)[0][0] 의 값만 가져온 후 리턴한다.

return counters.most_common(1)[0][0]

 

전체 코드

def mostCommonWord(paragraph : str, banned : list[str]):
    words = [word for word in re.sub('[^\w]', ' ', paragraph).lower().split() 
    if word not in banned]

    counters = collections.Counter(words)

    return counters.most_common(1)[0][0]