해당 내용은 ‘파이썬 알고리즘 인터뷰’ 책의 일부를 발췌하여 정리한 내용입니다.

그룹 애너그램

풀이

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        # 존재하지 않는 키를 삽입할 경우 발생하는 keyError가 나지 않도록 디폴트 생성
        anagrams = collections.defaultdict(list)

        for word in strs:
            # 정렬하여 딕셔너리에 추가
            anagrams[''.join(sorted(word))].append(word)
        return list(anagrams.values())

여러 가지 정렬 방법

파이썬은 팀소트(Timsort)를 기반으로 실제데이터를 빠르게 정렬할 수 있다.

sorted() : 파이썬 리스트를 정렬하는 함수

a = [2, 5, 1, 9, 7]
sorted(a)

out:
[1, 2, 5, 7, 9]

sorted()는 숫자뿐만 아니라 문자도 정렬이 가능하다.

b = 'zbdaf'
sorted(b)

out:
['a', 'b', 'd', 'f', 'z']

정렬한 리스트 [‘a’, ‘b’, ‘d’, ‘f’, ‘z’]를 다시 결합하려면 join()을 이용할 수 있다.

b = 'zbdaf'
"".join(sorted(b))

out:
'abdfz'

sorted()에 또한 key= 옵션을 지정해 정렬을 위한 키 또는 함수를 별도로 지정해줄 수 있다.

c = ['ccc', 'aaaa', 'd', 'bb']
# key= len : 길이 순서로 정렬하기
sorted(c, key = len)

out:
['d', 'bb', 'ccc', 'aaaa']

함수를 이용해 키를 정의하는 방법을 더 살펴보자.

a = ['cde', 'cfc', 'abc']

def fn(s):
	return s[0], s[-1]

sorted(a, key= fn)

out:
['abc', 'cfc', 'cde']

일반적인 sorted()를 사용했다면 알파벳 순서에 따라 [’abc’, ‘cde’, ‘cfc’] 순으로 출력되었겠지만, 여기서는 두번째 키로 마지막 문자열을 보게 했기 때문에 [‘abc’, ‘cfc’, ‘cde’] 순으로 출력된다.

람다를 이용하면 함수를 정의하지 않고도 한줄로 바로 처리할 수 있다.

sorted(a, key = lambda s : (s[0], s[-1]))

가장 긴 팰린드롬 부분 문자열

풀이

class Solution:
    def longestPalindrome(self, s: str) -> str:
        # 팰린드롬 판별 및 투포인터 확정
        def expand(left: int, right: int) -> str:
            while left >= 0 and right < len(s) and s[left] == s[right]:
                left -=1
                right += 1
            return s[left + 1: right]

        # 해당 사항이 없을 때 빠르게 리턴
        if len(s) < 2 or s == s[::-1]:
            return s

        result = ''
        # 슬라이드 윈도우 우측으로 이동
        for i in range(len(s) - 1):
            result = max(result,
                            expand(i, i + 1),
                            expand(i, i + 2),
                            key= len)

        return result