읽기 전
- 불필요한 코드나 잘못 작성된 내용에 대한 지적은 언제나 환영합니다.
- 개인적으로 배운 점을 정리한 글입니다.
문제 링크
LeetCode #819 Most Common Word
문제 풀이
알파벳을 제외한 나머지 문자들은 모두 ' '(공백)으로 치환한다. 그리고 공백으로 분리된 문자열을 list화하여 각 단어들에 대해 banned에 들어있지 않다면 개수를 체크하여 가장 큰 값을 가진 단어를 return하면 된다.
python 코드 - 1
class Solution:
def mostCommonWord(self, paragraph: str, banned: List[str]) -> str:
check = collections.defaultdict(int) # 귀찮으므로 defaultdict 생성
paragraph = paragraph.lower() # 대문자를 모두 소문자로 치환
paragraph = re.sub('[^\w]', ' ', paragraph) # 알파벳이 아니면 모두 공백
for item in paragraph.split(): # 공백으로 분리된 단어들에 대해
if item not in banned: # ban되지 않은 단어라면
check[item] += 1 # dict에 삽입
sol = list(check.items()) # 삽입된 item들을 list화 (List[tuple]형임)
sol.sort(key=lambda x: x[1], reverse=True) # 개수를 기준으로 '내림차순' 정렬
return sol[0][0] # 가장 앞의 값에 대해 단어 반환
python 코드 - 2
iterable 객체의 요소 count를 다룰 때 치트키 수준으로 사기적인 기능이 Counter 객체이다. 가급적 코테에서만 사용하고 면접에서는 면접관께 선질문을 해서 확인하는 게 좋다 생각한다. 그정도로 기능이 너무 강력하다.
class Solution:
def mostCommonWord(self, paragraph: str, banned: List[str]) -> str:
'''
list comprehension으로 알파벳이 아닌 문자들을 공백으로 치환한 문자열을
소문자로 다시 치환한 뒤 split으로 공백을 분리한다.
그리고 추가하기 전 banned에 등록된 단어인지 체크한다.
'''
paragraph = [word for word in re.sub('[^\w]', ' ', paragraph)
.lower().split() if word not in banned]
check = collections.Counter(paragraph) # list iterable 객체를 Counter에 넣는다.
'''
Counter.most_common 함수는 개수 순서대로 내림차순 정렬한다.
인자 값은 그 뒤의 값에 대해 drop함을 의미한다.
반환형태는 List[tuple]이므로 값 접근을 위해 두 개의 index 필요
'''
return check.most_common(1)[0][0]
'Algorithms > LeetCode' 카테고리의 다른 글
LeetCode #15 3Sum (0) | 2021.05.07 |
---|---|
LeetCode #937 Reorder Data in Log Files (0) | 2021.04.24 |
LeetCode #344 Reverse String (0) | 2021.04.24 |
LeetCode #125 Valid Palindrome (0) | 2021.04.24 |
LeetCode #49 Group Anagrams (0) | 2021.04.24 |