문제
금지된 단어를 제외한 가장 흔하게 등장하는 단어를 출력하라. 대소문자 구분을 하지 않으며, 구두점(마침표, 쉼표) 또한 무시한다.
예제 1
입력
paragraph = "Bob hit the ball, the hit BALL flew far after it was hit."
banned = ["hit"]
출력
"ball"
다음과 같은 조건에 맞게 입력값에 대한 전처리 작업이 필요합니다.
1. 입력값에 대소문자가 섞여 있으므로, 소문자 처리
2. 쉼표 등 구두점 존재
이후 문자 배열에 대해 각 요소의 개수를 구한 후, 가장 높은 갯수의 단어를 반환하도록 구현해야합니다.
리스트 컴프리헨션, Counter 객체를 사용한 풀이
먼저 쉼표, 마침표 등의 구두점을 정규식을 사용해 제거하는 전처리 과정을 수행하도록 하겠습니다.
정규식에서 \w는 문자를 의미하므로, not을 의미하는 ^를 붙여서, 입력값에서 단어 문자가 아닌 모든 문자를 공백으로 치환하도록 합니다. 또한 리스트 컴프리헨션의 조건절에 banned에 포함되지 않은 단어만을 대상으로 하도록 구현합니다.
# 함수 내부
words = [ word for word in re.sub(r'[^\w]', ' ', paragraph)
.lower().split()
if word not in banned
]
이제 단어의 갯수를 찾아야한다. 갯수를 담아두는 변수를 딕셔너리를 사용하며, defaultdict(int)를 사용하여 int 값이 자동으로 부여되게 한다.
# 함수 내부
counts = collections.defaultdict(int)
for word in words:
counts[word] += 1
return max(counts, key=counts.get)
defaultdict가 아닌 Counter를 사용할 수도 있습니다. Counter 생성자는 배열의 각 원소가 몇번씩 나오는지가 저장된 객체를 반환합니다.
또한 이중에서 가장 흔하게 등장하는 단어의 첫 번째 값을 most_common(1)으로 추출합니다. 이때 [('ball', 2)]가 되며 이 값의 [0][0]을 추출하여 첫 번째 인덱스의 키를 반환하도록 합니다.
# 함수 내부
counts = collections.Counter(words)
return counts.most_common(1)[0][0]
'Computer Science > 알고리즘 - 문자열 처리' 카테고리의 다른 글
로그 파일 재정렬(lambda, + 연산자) (1) | 2023.01.21 |
---|---|
문자열 뒤집기(reverse, Slicing) (0) | 2023.01.16 |
팰린드롬 구별(Deque, Slicing) (0) | 2023.01.16 |