코테 언어를 C++에서 파이썬으로 바꿨는데 이런 문자열 조작은 확실히 파이썬이 좋은거 같다.
우선 WA를 받았다.
class Solution:
def mostCommonWord(self, paragraph: str, banned: List[str]) -> str:
delimeters = "!?',;."
splited_paragraph = paragraph.split()
for index, word in enumerate(splited_paragraph):
splited_paragraph[index] =
''.join(char for char in word
if char not in delimeters).lower()
max_count, max_word = 0, ""
for index, word in enumerate(splited_paragraph):
if word in banned:
continue
temp = splited_paragraph.count(word)
if temp > max_count:
max_count = temp
max_word = word
return max_word
여전히 코드에 C++ 스타일이 가득한거 같다. 이 부분은 차차 바꿔가야지.
먼저 문장을 공백으로 나누어 리스트로 나눈다.
그 후 각 공백으로 나누어진 리스트들의 원소인 나누어진 문자열에 대하여, 그 문자열에 구분자들이 있으면 그냥 지운다.
그 후 나누어진 리스트들을 순회하면서 list.count()를 사용하여 가장 많이 등장한 단어를 찾고 그 단어를 반환한다.
내 코드의 문제점은 구분자가 나오면 그것도 구분자에 대해서도 분리해야하는데 그냥 패스하고 이어붙여서 이어붙인 문자열을 만들었다.
def mostCommonWord(self, paragraph: str, banned: List[str]) -> str:
p = [ word for word in re.sub(r'[^\w]',' ',paragraph)
.lower().split() if word not in banned]
counts = collections.Counter(p)
return counts.most_common(1)[0][0]
정규표현식을 통해 아주 간단하게 해결 했다.
https://velog.io/@ednadev/파이썬-정규표현식과-re모듈 님의 블로그를 간단하게 참고했다.
re.sub(r'[^\w]',' ',paragraph)
는 정규표현식을 이용해 주어진 문자열 (paragraph)에서
일치하는 패턴( [^\w])을 찾아내어 공백으로 치환한다
예를 들어
"a, a, a, a, b,b,b,c, c" -> "a a a a b b b c c"로 변한다.
lower()로 소문자로 바꾼뒤, 파라미터 없이 split호출하면 공백으로 나누는 것을 이용해 split 호출 한다.
Counter 함수는 아래 블로그를 참조했다.
https://www.daleseo.com/python-collections-counter/
리스트,셋, 문자열을 넘기면 원소들의 갯수를 세어 딕셔너리 형태로 원소와 갯수를 리턴해준다.
그리고 가장 많이 등장한 원소 순서대로 정렬된 배열을 리턴하는
counter.most_common()
도 있다.
입력문자열이 "a, a, a, a, b,b,b,c, c"이고 banned 문자가 'a'일때
리턴값은
[('b',3),('c',2')]
이다. 그 중 첫번째 원소 ('b',3)의 첫번째 원소 'b'를 리턴하면 된다.