Python 알고리즘(3) _가장 흔한 단어, 그룹 애너그램

hjseo-dev·2021년 6월 3일
0

Python 알고리즘

목록 보기
6/13
post-thumbnail

✏️ 가장 흔한 단어

문제

금지된 단어를 제외한 가장 흔하게 등장하는 단어를 출력하라. 대소문자 구분을 하지 않고, 구두점도 무시한다.

입력

paragraph = "Bob hit a ball, the hit BALL flew far after it was hit."
banned = ["hit"]

출력

 "ball"

✍️ 문제풀이
1. 대소문자와 쉼표, 구두점 등을 처리해주는 작업을 한다. (= 데이터클렌징)
2. 개수를 담아두는 변수로 딕셔너리를 사용하며 기본 값이 자동으로 부여되게 한다. (키 존재 유무를 확인하지 않고 즉시 사용 가능)
3. 딕셔너리 변수에서 값이 가장 큰 키를 가져온다.

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] 
       
        word_count = defaultdict(int)
        
        for word in words:
            word_count[word]+=1
       
        return max(word_count, key=word_count.get)
    
        

🔎 코드분석

  • re.sub안의 \w는 단어문자를 뜻하며 ^는 not을 의미한다. 따라서 re.sub(r'[^\w]',' ',paragraph)는 단어문자가 아닌 모든 문자를 공백으로 치환한다는 의미이다.
  • 조건절에는 금지어인 banned를 제외한 단어를 대상으로 하기위한 조건을 넣어준다.
  • 딕셔너리를 사용한 이유는 단어의 위치를 함께 가져오기 위함이다. 닥셔너리 변수에 같은수가 발견될 때 마다 +1 을 해주며 개수를 누적한다.
  • 마지막으로 max 함수를 사용하여 딕셔너리 중 가장 큰 인덱스의 키 값을 가져온다.

✏️ 그룹 애너그램

"애너그램" 이란, 언어유희로 문자를 재배열 하여 다른 뜻을 가진 단어로 바꾸는 것을 말한다.

문제

문자열 배열을 받아 애너그램 단위로 그룹핑하라

입력

strs = ["eat","tea","tan","ate","nat","bat"]

출력

[["bat"],["nat","tan"],["ate","eat","tea"]]

✍️ 문제풀이
정렬하여 비교하는 방법을 사용한다.
1. sorted()는 문자열을 잘 정렬하며 결과를 리스트 형태로 리턴하는데, 이를 다시 키로 사용하기 위해 join()으로 합쳐 이 값을 키로하는 딕셔너리로 구성한다.
2. 애너그램 끼리 같은 키를 갖게 되어 append한다.
3. 딕셔너리의 키를 제외한 값을 리스트에 저장하여 출력한다.

 def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
     anagrams = collections.defaultdict(list)
        
     for word in strs:
     	# 정렬한 문자를 딕셔너리에 다시 추가
         anagrams[''.join(sorted(word))].append(word)
            
     return list(anagrams.values())

💡 여러가지 정렬 방법

  • sorted() 함수를 이용하여 정렬하기
a = [2, 4, 1, 9, 7]
sorted(a)
>>> [1, 2, 4, 7, 9]
  • 리스트 내부 정렬
    리스트 자체를 제자리 정렬, 추가 저장공간이 필요하지 않음
alist.sort()
  • 함수를 이용해 키를 정의하는 방법
a = ['cde', 'cfc', 'abc']
# 함수를 이용
def fn(s):
	return s[0], s[-1]   # 첫 문자열과 마지막 문자열 기준으로 정렬
print(sorted(a, key = fn))

>>> ['abc', 'cfc', 'cde']
--------------------------------
a = ['cde', 'cfc', 'abc']
# 람다를 이용하여 처리
sorted(a, key=lamda s: (s[0],s[-1]))

>>> ['abc', 'cfc', 'cde']

0개의 댓글