본문 바로가기

2023 동계 파이썬 알고리즘 멘토링

2023 파이썬 알고리즘 멘토링 1일차 - 문자열 조작

2023년 파이썬 알고리즘 멘토링 수업을 들으면서 느끼고 공부한 점을 정리한다. 

이번 글은 1일차의 문자열 조작 파트에 대해서 공부한 코드들 이다

첫 문제는 LeetCode의 125번 Vaild Palindrome문제 이다.

문제를 직관적으로 봤을 때 소문자로 바꿔서 숫자나 알파벳만 뽑아서 슬라이싱으로 확인했다.

def isPalindrome(self, s: str) -> bool:
        s=s.lower()
        answer = ""
        for i in s:
            if i.isalnum():
                answer += i
        return answer == answer[::-1]

같은 문제를 import re의 정규표현식을 사용해서  re.sub을 사용해서 바꾸고 슬라이싱으로 확인했다.

import re
def isPalindrome(self, s: str) -> bool:
        s=s.lower()
        s = re.sub('[^0-9a-z]','',s)
        return s == s[::-1]

 

 

다음 문제는 LeetCode의 937. Reorder Log Files 문제이다. 정해진 규칙대로 정렬하는 문제이다.

알파벳이랑 숫자를 구별한 이후에 조건에 맞춰서 알바펫 부분을 정렬한 이후 다시 합쳤다.

def reorderLogFiles(self, logs: List[str]) -> List[str]:
        alphas = []
        numbers = []
        for i in logs:
           if not i[-1].isdigit():
               alphas.append(i)
           else:
              numbers.append(i)
        alphas.sort(key = lambda x: (x.split()[1:],x.split()[0]))
        return alphas + numbers

일반적인 단어에서는 zzzzzz보다 뒤에 있는 단어가 없다고 생각해서  lambda  함수랑sorted의 key의 특징을 살려서 코드를 짰다. 

def reorderLogFiles(self, logs: List[str]) -> List[str]:
        return sorted(logs, key = lambda x: (x.split()[1:],x.split()[0]) if x.split()[-1].isalpha() else (["zzzzzz"],"zzzzzz"))

 

다음 문제는 LeetCode의 49. Group Anagrams이다. 문자열이 들어오면 같은 스펠링을 사용하는 것 끼리 묶어서 출력하는 문제이다.

 

collections 모듈의 defaultdict를 사용해서 각 단어를 정렬해서 튜플로 key값에 넣고 value값을 추가해줬다. defaultdict를 사용해서 초기화를 해야하는 것은 list형식으로 초기화를 시켰다.

from collections import defaultdict

def groupAnagrams(strs):
    strs = sorted(strs)
    strs_dict = defaultdict(list)
    for i in strs:
        strs_dict[tuple(sorted(i))].append(i)
    answer = sorted(list(strs_dict.values()), key = lambda x: len(x))
    return answer
strs = ["eat","tea","tan","ate","nat","bat"]

print(groupAnagrams(strs))

 

알고리즘 멘토링에서 문자열 부분을 들으면서 중요하다고 생각한거는 다음과 같다.

1. 각 문제열의 기본 method를 많이 알고 암기해두는거

2. sorted의 key로 lambda 함수를 써서 원하는 조건을 정렬하는 방법

3. split()랑 split('')의 차의점 (추후에 관련한 글을 쓸 예정이다)

4. collections의 defaultdict의 사용법과 사용 안했을 때 어떤 식으로 해야하는지

5. import re의 정규표현식을 많이 사용해보기

 

여기까지가 기본적으로 알아야하고 공부해야하는 거라고 생각한다.

코드나 공부해야한다고 생각하는 부분은 추후에 직접 해보고 정리하면서 올릴 예정이다.