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의 정규표현식을 많이 사용해보기
여기까지가 기본적으로 알아야하고 공부해야하는 거라고 생각한다.
코드나 공부해야한다고 생각하는 부분은 추후에 직접 해보고 정리하면서 올릴 예정이다.