문제 : 

 

입력값으로 문자열이 주어지고, 또한 리스트의 형태로 금지된 단어들이 주어진다. 입력값으로 주어진 문자열중, 가장 빈도가 높게 나타나는 "금지되지 않은" 단어를 리턴하는 것이다. 첫번째 예시를 보면 아마 이해가 더 잘 될 것이다. 하지만 조건이 몇가지 있다.

 

1. 대, 소문자를 신경쓰지 않음. 즉, 1번의 예시에서 BALL과 ball은 같은 취급을 당한다.

2. , . ! ? 같은 문장 부호는 모두 무시된다. 

 

즉, 첫번째 예시에서의 paragraph의 원형은 "Bob hit a ball, the hit BALL flew far after it was hit."이지만, 문제의 조건에 부합하려면 "bob hit a ball the hit ball flew far after it was hit"으로 바뀌어야 한다.

 

아래는 내가 제출해 통과한 코드이다.

class Solution:
    def mostCommonWord(self, paragraph: str, banned: List[str]) -> str:
        lower_paragraph = paragraph.lower()
        translator = str.maketrans('', '', string.punctuation)
        cleaned_text = lower_paragraph.translate(translator)
        words = cleaned_text.split()
        
        banned_set = set(banned)
        word_counts = Counter(word for word in words if word not in banned_set)
        
        most_common_word, _ = word_counts.most_common(1)[0]
        
        return most_common_word

 

 

- 먼저, 문자열의 모든 문자들의 대/소문자 구분을 없애기 위해 .lower()함수를 이용해 소문자로 바꿔 주었다.

- `str.maketrans()` 메서드는 문자열의 문자 매핑 테이블을 생성하는 데 사용된다. 이 테이블은 `str.translate()` 메서드와 함께 사용되어 문자열의 문자를 다른 문자로 변환하거나 제거하는 데 사용된다. 이 메서드에 전달되는 세 가지 인수는 다음과 같다:

1. 첫 번째 인수: 변환할 문자의 문자열
2. 두 번째 인수: 변환 후의 문자의 문자열
3. 세 번째 인수: 제거할 문자의 문자열

다음은 `str.maketrans('', '', string.punctuation)`의 각 인수가 무엇을 의미하는지 알아보자:

1. 첫 번째 인수 (`''`): 변환할 문자의 문자열이다. 여기서는 빈 문자열이므로 변환할 문자가 없다.
2. 두 번째 인수 (`''`): 변환 후의 문자의 문자열이다. 여기서도 빈 문자열이므로 변환 후의 문자도 없다.
3. 세 번째 인수 (`string.punctuation`): 제거할 문자의 문자열이다. `string.punctuation`은 모든 문장 부호를 포함하는 문자열이다. 따라서 이 매개변수는 이 문자열에 포함된 모든 문자를 제거하라는 의미이다.

예제

아래는 `str.maketrans()`와 `str.translate()`를 사용하여 문자열에서 모든 문장 부호를 제거하는 코드이다:

import string

text = "Hi I am jihoo. and, you are so, nice!"

# 모든 문장 부호를 제거하기 위한 변환 테이블 생성
translator = str.maketrans('', '', string.punctuation)

# 변환 테이블을 사용하여 문장 부호 제거
cleaned_text = text.translate(translator)

print(cleaned_text)  # 출력: Hi I am jihoo and you are so nice


이 코드에서 `str.maketrans('', '', string.punctuation)`는 모든 문장 부호를 제거하기 위한 변환 테이블을 생성한다. `str.translate(translator)`는 이 변환 테이블을 사용하여 `text` 문자열에서 모든 문장 부호를 제거한다. 결과적으로 `cleaned_text`는 문장 부호가 제거된 문자열이 된다.

요약
- 첫 번째 인수와 두 번째 인수: 변환할 문자를 다른 문자로 매핑하는 데 사용된다. 여기서는 빈 문자열로 설정되어 변환할 문자가 없다.
- 세 번째 인수: 제거할 문자를 지정한다. 여기서는 `string.punctuation`을 사용하여 모든 문장 부호를 제거한다.

 

- 이제 말끔하게 trimmed된 문자열들을 순회하기 편하도록 .split()을 이용해 리스트에 담아준다.

- 여기서 Counter클래스를 처음 써보았다. Counter 클래스는 무엇일까?

더보기

`collections.Counter`란 무엇인가?
`collections.Counter`는 파이썬의 `collections` 모듈에 포함된 클래스이다. `Counter`는 주로 해시 가능한 객체(주로 문자열이나 숫자)의 개수를 셀 때 사용된다. 기본적으로는 딕셔너리와 비슷하지만, 요소의 빈도를 셀 때 매우 유용하게 사용할 수 있는 특수한 형태의 딕셔너리이다.

주요 기능 및 사용법
1. 초기화: `Counter` 객체는 문자열, 리스트, 튜플 또는 다른 iterable을 인수로 사용하여 초기화할 수 있다.

   from collections import Counter
   
   # 문자열을 인수로 사용
   c = Counter("hello")
   print(c)  # 출력: Counter({'l': 2, 'h': 1, 'e': 1, 'o': 1})
   
   # 리스트를 인수로 사용
   c = Counter(['apple', 'banana', 'apple', 'orange', 'banana', 'apple'])
   print(c)  # 출력: Counter({'apple': 3, 'banana': 2, 'orange': 1})
   
   # 키워드 인수를 사용
   c = Counter(a=2, b=3, c=1)
   print(c)  # 출력: Counter({'b': 3, 'a': 2, 'c': 1})



2. 요소의 개수 확인: `Counter` 객체는 각 요소의 개수를 저장한다. 딕셔너리와 비슷하게 키를 사용하여 각 요소의 개수를 확인할 수 있다.

   c = Counter("hello")
   print(c['l'])  # 출력: 2


3. 가장 흔한 요소 찾기: `most_common()` 메서드를 사용하여 가장 흔한 요소와 그 개수를 튜플 리스트 형태로 반환할 수 있다.

   c = Counter("hello")
   print(c.most_common(1))  # 출력: [('l', 2)]
   print(c.most_common(2))  # 출력: [('l', 2), ('h', 1)]


 most_common(1)`이란 무엇인가?
`most_common(n)` 메서드는 `Counter` 객체에서 가장 흔하게 등장하는 요소 상위 `n`개를 빈도수와 함께 튜플 형태로 반환합니다. `most_common(1)`은 가장 흔하게 등장하는 요소 하나를 반환한다.

예제

from collections import Counter

text = "Hi I am jihoo. and, you are so, nice!"
words = text.lower().split()

# 단어 빈도수 세기
counter = Counter(words)

# 가장 빈도가 높은 단어 찾기
most_common_word = counter.most_common(1)
print(most_common_word)  # 출력: [('hi', 1)] (예시)


위 코드에서 `counter.most_common(1)`은 단어 빈도수 중 가장 높은 단어와 그 빈도를 리스트 형태로 반환한다. 여기서 `most_common(1)`의 결과는 리스트 안에 튜플이 포함된 형태이다. 이 리스트의 첫 번째 요소를 사용하여 가장 흔한 단어를 얻을 수 있다.

 

+ Recent posts