(EASY) LeetCode No.819 - Most Common Word

Kade Jeon·2024년 2월 7일

LeetCode

목록 보기
4/6

(EASY) LeetCode No.819 - Most Common Word 풀러가기

문제

  • 문자열을 입력받아, 가장 흔하게 나오는 단어를 출력하기
  • 구두점(, or .) 또한 무시한다.

문제풀이

교재에서는 리스트 컴프리헨션을 사용해서 풀고, Counter 객체를 사용했다. 시간은 1시간 1분이 소요됐다. 시간에 관련해서는 뒤에 결과에 아쉬움을 조금 써보겠다.

교제에서 참고한 내용 re.sub

re.sub(r"[^\w]", " ", paragraph)
  • import re 해야만 되는 경우가 있으니 참고.
  • 위와 같이 작성하면 문자열(paragraph)을 받아서 문자(\w)를 제외한(^) 모든 것을 공백(" ")으로 치환한다.
  • r이 계속 붙길래 찾아보니 이스케이프 문자로 해석하지 않게 하는 역할이었다. (고마워 gpt)

    r은 raw string을 나타냅니다. 이것은 이스케이프 시퀀스를 해석하지 않고 문자 그대로 문자열을 해석하도록 파이썬에 지시합니다. 일반 문자열에서는 백슬래시()가 이스케이프 문자로 해석되지만, raw string에서는 그렇지 않습니다. 이것은 정규 표현식이나 파일 경로 등과 같이 역슬래시를 사용하는 문자열에서 특히 유용합니다.
    따라서 r이 붙은 경우, 정규 표현식 문자열 내의 백슬래시가 이스케이프 문자로 해석되지 않으므로, 이스케이프를 반영하지 않고 그대로 문자열을 해석하게 됩니다.

내가 제출한 코드

  • Language: Python3
	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]
  • collection을 쓴 이유는, 파이썬은 잘 모르지만 java처럼 뭔가 있지 않을까하고 사용해보았다.
  • Counter의 경우도 뭔지는 모르겠지만 이름을 보니 무언가 세어 줄 것 같아서 사용해보았다.
  • 역시나 내가 예상한 기능이 그대로 구현되어 있었다.

리스트 컴프리헨션을 이용한 방법

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]
  • 튜플에서 꺼낼때 [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개 말고 2중, 3중 여러 개 for문을 넣어서도 활용할 수 있다. 그렇게 하면 가장 왼쪽의 for문이 가장 먼저 실행된다.
  • 위에서 보았듯이 if문으로 조건을 활용할 수 있다.
  • 두 가지를 조합하면 여러 for문 사이에 if문을 걸어서 각 for 문마다 원하는 조건에 맞는 데이터만 뽑을 수 있다 !

결과

처음에 교재에서 리스트 컴프리헨션에 대해서 설명했을 때는 이게 뭔가... 하고 어렵게 생각했다. 그런데 막상 코드를 통해서 자세히 들여다보니 오히려 코드가 간결해지는 장점이 있었다. 다만, 많이 복잡해지는 경우는 for 문을 풀어써두는 게 코드를 읽고 해석하는데는 더 도움이 될 수도 있을 것 같다는 생각이 들었다.

시간의 경우에는 1시간 1분이 소요됐는데, 바보같이 input으로 데이터가 문자열이 들어오는데 문자열 리스트로 들어오는 줄 알고 코드를 짰다가 실행이 되지 않았다. 뒤늦게 해당 부분을 찾아내서 수정해서 제출할 수 있었는데, 이 시간을 줄였다면 1시간 내로 풀 수 있지 않았을까 하는 아쉬움이 들었다.
항상 문제와 input을 잘 확인하자 !

profile
안녕하세요. 백엔드 개발자가 되고 싶은 Kade 입니다.

0개의 댓글