(EASY) LeetCode No.819 - Most Common Word 풀러가기
교재에서는 리스트 컴프리헨션을 사용해서 풀고, Counter 객체를 사용했다. 시간은 1시간 1분이 소요됐다. 시간에 관련해서는 뒤에 결과에 아쉬움을 조금 써보겠다.
re.sub(r"[^\w]", " ", paragraph)
r은 raw string을 나타냅니다. 이것은 이스케이프 시퀀스를 해석하지 않고 문자 그대로 문자열을 해석하도록 파이썬에 지시합니다. 일반 문자열에서는 백슬래시()가 이스케이프 문자로 해석되지만, raw string에서는 그렇지 않습니다. 이것은 정규 표현식이나 파일 경로 등과 같이 역슬래시를 사용하는 문자열에서 특히 유용합니다.
따라서 r이 붙은 경우, 정규 표현식 문자열 내의 백슬래시가 이스케이프 문자로 해석되지 않으므로, 이스케이프를 반영하지 않고 그대로 문자열을 해석하게 됩니다.
class Solution:
def mostCommonWord(self, paragraph: str, banned: List[str]) -> str:
#결과 담을 리스트
result = []
#특수문자 제거 후, 공백으로 잘라서 리스트로 만듦
removed = re.sub(r"[^A-Za-z]", r" ", paragraph).lower()
splited = removed.split()
#리스트를 돌면서 각 단어가 금지된 것과 일치하면 패스, 일치하지 않으면 결과에 담음
for word in splited:
if word in banned:
continue
result.append(word)
# 결과에서 가장 많은 값이 나온건 0번째 인덱스임, most는 Tuple로 반환됨.
most = collections.Counter(result).most_common().pop(0)
# 튜플 ex.('ball', 2) 이므로 0번째 요소가 단어임
return most[0]
class Solution:
def mostCommonWord(self, paragraph: str, banned: List[str]) -> str:
words = [word for word in re.sub(r"[^\w]", " ", paragraph)
.lower().split()
if word not in banned]
return collections.Counter(words).most_common()[0][0]
for n in range(10):
print(n)
# 위와 아래는 완전히 동일한 코드이다.
[print(n) for n in range(10)]
words = [word for word in re.sub(r"[^\w]", " ", paragraph)
.lower().split()
if word not in banned]
# 위의 리스트 컴프리헨션을 for 문으로 바꿔보면 아래와 같다.
words = []
for word in re.sub(r"[\w]"," ","paragraph).lower().split():
if word in not banned:
words.append(word)

처음에 교재에서 리스트 컴프리헨션에 대해서 설명했을 때는 이게 뭔가... 하고 어렵게 생각했다. 그런데 막상 코드를 통해서 자세히 들여다보니 오히려 코드가 간결해지는 장점이 있었다. 다만, 많이 복잡해지는 경우는 for 문을 풀어써두는 게 코드를 읽고 해석하는데는 더 도움이 될 수도 있을 것 같다는 생각이 들었다.
시간의 경우에는 1시간 1분이 소요됐는데, 바보같이 input으로 데이터가 문자열이 들어오는데 문자열 리스트로 들어오는 줄 알고 코드를 짰다가 실행이 되지 않았다. 뒤늦게 해당 부분을 찾아내서 수정해서 제출할 수 있었는데, 이 시간을 줄였다면 1시간 내로 풀 수 있지 않았을까 하는 아쉬움이 들었다.
항상 문제와 input을 잘 확인하자 !