이번 문제는 paragraph 에 들어온 문자열 중 가장 많이 등장한 '단어'를 골라내는 문제이다. 대신 banned 리스트에 있는 단어들은 제외하고 따지는 것이 조건이다.(조건에도 쓰여있지만 banned 리스트에는 0개부터 100개까지의 단어가 들어올 수 있다)
입력에는 문자 뿐만 아니라 기호들도 섞여 있다는 것과
답을 출력할 때 lowercase로 출력해야한다는 것을 기억해야한다.
답은 '유일'하다는 조건이 있으므로 중복 답에 대해서는 고려하지 않아도 된다.
알고리즘을 풀 때 예외 케이스를 생각하는 것이 중요한데, 이런 문자열 혹은 리스트 입력을 받는 문제에서는
- 무한한 문자열/리스트
- 비어있는 문자열/리스트(혹은 한개, 두개로 구성되어 있는)
위 두 가지의 케이스를 주의해서 문제를 풀어야한다.
from re import sub
class Solution:
def mostCommonWord(self, paragraph: str, banned: List[str]) -> str:
words = sub(r'[^\w]',' ',paragraph).split()
lower_words = []
for i in words:
lower_words.append(i.lower())
max = 0
for j in set(lower_words):
num = lower_words.count(j)
if num > max and j not in banned:
max = num
result = j
return result
해설: 따라서 먼저 받은 문자열에서 영문자가 아닌 기호들을 지워주는 가공을 진행했다. 앞선 문제에서 사용했던 파이썬 자체 라이브러리인 re 에서 sub() 함수를 이용하였다.
^\w 를 통해 영문자가 아닌 기호들을 공백으로 대체한 후 split()을 통해 words 리스트 안에 저장하였다.
(re 라이브러리가 생소해서인지 앞선 문제에서들도 그랬지만 이 과정이 처음에는 어렵게 느껴졌다)
이후 과정은 간단하다.
for문을 통해 대소문자가 중구난방으로 되어있는 단어들을 소문자로 바꿔주고 lower_words 리스트 안에 저장한다.
다시 for문을 통해 소문자로 바꾼 단어들의 갯수를 세어주면서 max 변수를 변화시켜주면 된다. banned 리스트의 단어들을 제외해주는 부분은 마지막 if 문을 통해 구현하였다.
이번 문제를 풀면서 re 라이브러리의 활용도에 대해서 더 크게 배운 것 같다. 수일 내에 re 라이브러리에 대한 공부도 마쳐야겠다.
'LeetCode' 카테고리의 다른 글
[LeetCode/리트코드] No.937, 로그 파일 재정렬(Reorder Data in Log Files) - Python (2) | 2023.08.02 |
---|---|
[LeetCode/리트코드] No.344, 문자열 뒤집기(Reverse String) - Python (1) | 2023.08.01 |
[LeetCode/리트코드] No.125, 유효한 팰린드롬(Valid Palindrome) - Python (1) | 2023.08.01 |