[2부 파이썬] 6장 문자열 조작

Minhee kang·2021년 8월 1일
0

📌 1) 유효한 팰린드롬 ( 리트코드 125. Valid Palindrome )

📝 isalnum(), 정규 표현식

✔ 풀이

from collections import deque

class Solution(object):
    def isPalindrome(self, s):
        
        #문자와 숫자 외 나머지 필터링
        strs = deque() 
        for char in s:
            if char.isalnum():  
                strs.append(char.lower())
        
        #양쪽 끝 문자가 다르면 팰린드롬이 아님
        while len(strs) > 1:
            if strs.popleft() != strs.pop():
                return False
        
        return True

✔ 풀이 (슬라이싱 사용)

class Solution(object):
    def isPalindrome(self, s):
        
        #문자와 숫자 외 나머지 필터링
        strs = []
        for char in s:
            if char.isalnum():
                strs.append(char.lower())
        
        return strs == strs[::-1] #슬라이싱

✔ 풀이 (슬라이싱, 정규표현식 사용)

class Solution(object):
    def isPalindrome(self, s):
        
        s = s.lower() #s내의 문자 소문자로 변환
        #정규식을 사용하여 문자와 숫자 외 나머지 필터링(정규표현식 사용)
        s = re.sub('[^a-z0-9]','',s)
        
        return s == s[::-1] #슬라이싱

📌 2) 문자열 뒤집기 ( 리트코드 344. Reverse String )

📝 reverse()

✔ 풀이 (투 포인터를 이용한 스왑)

class Solution(object):
    def reverseString(self, s):
        left, right = 0, len(s)-1
        while left < right:
            s[left], s[right] = s[right], s[left]
            left += 1
            right -= 1
        return s

✔ 풀이 (pythonic way)

class Solution(object):
    def reverseString(self, s):
        return s.reverse()

📌 3) 로그 파일 재정렬 ( 리트코드 937. Reorder Log Files )

📝 isdigit(), sort(), sorted(), lambda

✔ 풀이

class Solution(object):
    def reorderLogFiles(self, logs):
        letter, digit= [], []
        for log in logs:
            if log.split()[1].isdigit():  #0인덱스는 식별자
                digit.append(log)
            else:
                letter.append(log)
        
        #digit-logs는 순서를 유지
        #letter-logs는 컨텐츠를 사전순으로 정렬. 
        #만약 컨텐츠가 같다면, 식별자를 사전순으로 정렬
        letter.sort(key = lambda x : (x.split()[1:], x.split()[0]))
        
        #letter-logs가 digit-logs보다 앞에 존재해야 함
        return letter + digit

📌 4) 가장 흔한 단어 ( 리트코드 819. Most Common Word )

📝 정규표현식, Counter

✔ 풀이

from collections import Counter

class Solution(object):
    def mostCommonWord(self, paragraph, banned):
        
        strs = [] #카운트 할 문자만 모아놓을 리스트
        for s in re.sub(r'[^\w]', ' ', paragraph).lower().split():
            if s not in banned: #금지 된 단어랑 다를 경우
                strs.append(s)  

        return Counter(strs).most_common(1)[0][0]

📌 5) 그룹 애너그램 ( 리트코드 49. Group Anagrams )

📝 defaultdict, join(), values()

✔ 풀이

from collections import defaultdict

class Solution(object):
    def groupAnagrams(self, strs):
        
        anagrams_dic = defaultdict(list)
        for str in strs:
            anagrams_dic[''.join(sorted(str))].append(str)
        
        return list(anagrams_dic.values())
    
#str = 'eat' 일 경우, sorted(str)하면 ['a', 'e', 't'] 반환
#str.sort()하면 AttributeError: 'unicode' object has no attribute 'sort'발생

📌 6) 가장 긴 팰린드롬 부분 문자열 ( 리트코드 5. Longest Palindromic Substring )

📝 max()

✔ 풀이

class Solution(object):
    def longestPalindrome(self, s):
        #팰린드롬 일 경우 계속하여 왼쪽, 오른쪽으로 확장해나아가는 함수
        def expand(left, right): #투 포인터 left, right
            while left >= 0 and right < len(s) and s[left] == s[right]:
                left -= 1 #왼쪽으로 확장
                right += 1 #오른쪽으로 확장
            return s[left + 1:right]
        
        #길이가1 이거나 s전체가 팰린드롬 일 경우 s를 그대로 return
        if len(s) < 2 or s == s[::-1]:
            return s
        
        longest = '' #가장 긴 팰린드롬
        #길이가 짝수인 팰린드롬(초기 길이 2), 홀수인 팰린드롬(초기길이3)으로 시작
        for i in range(len(s)-1):  
            longest = max(longest, expand(i, i + 1), expand(i, i + 2), key = len)
        
        return longest

#max도 key속성 이용하여 기준 정할 수 있음

0개의 댓글