LEET Code 문제 풀이 (문자열 )

이상원·2022년 7월 22일
0

leetcode

목록 보기
1/1

125 번 유효한 팰랜드롬

나의 풀이

class Solution:
    def isPalindrome(self, s: str) -> bool:
        s= s.lower()
        data=[]
        for c in s:
            if c.isalnum():
                data.append(c)
        comp = data.copy()
        data.reverse()
   
        return comp == data

교재 코드

  • re 부분 확인할 것

  • 슬라이싱 참고할 것! <- 내부 C로 구현 제일 빠름
    -> [::-1] 뒤집는 코드

import re


class Solution:
    def isPalindrome(self, s: str) -> bool:
        s = s.lower()
        # 정규식으로 불필요한 문자 필터링
        s = re.sub('[^a-z0-9]', '', s)

        return s == s[::-1]  # 슬라이싱

344 번 문자열 뒤집기

나의 코드

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        s[:]=s[::-1] # s는 이라고 할 경우 메모리 추가 할당이라 안된다고 함
        

교재 코드


from typing import List


class Solution:
	# 투 포인터 스왑 방식 <- 고전적 방식
    def reverseString1(self, s: List[str]) -> None:
        left, right = 0, len(s) - 1
        while left < right:
            s[left], s[right] = s[right], s[left]
            left += 1
            right -= 1
            
    # pythonic
    def reverseString2(self, s: List[str]) -> None:
       s.reverse()

937번 로그파일 재정렬

나의 코드(교재와 동일 <- 람다 표현식만 체크)

class Solution:
    def reorderLogFiles(self, logs: List[str]) -> List[str]:
        digits = []
        letters =[]
        for log in logs:
            if log.split()[1].isdigit():
                digits.append(log)
            else:
                letters.append(log)
                
        
        letters.sort(key = lambda x : (x.split()[1:], x.split()[0]))
      
        return letters+digits

819 가장 흔한 단어

나의 코드

import re
class Solution:
    def mostCommonWord(self, paragraph: str, banned: List[str]) -> str:
        
        data = re.sub('[^a-z]',' ',paragraph.lower())
        data=data.split()
        
        
        for ban in banned:
            idx=[]
            
            for i,d in enumerate(data):
                if d == ban.lower():
                    idx.append(i)
            print(idx)
            for i in reversed(idx):
                data.pop(i)
            
                
                
        check = set(data)       
        cnt =[0]*len(check)
        
        check = dict(zip(check,cnt))
        print(check)
        for d in data:
            check[d]+=1
            
        data = sorted(check.items(),key= lambda x : x[1] ,reverse=True )
        
        return data[0][0]

교재 코드

  • collections.Counter 에 대해서 공부할 것!
import collections
import re
from typing import List


class Solution:
    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]

        counts = collections.Counter(words)
        # 가장 흔하게 등장하는 단어의 첫 번째 인덱스 리턴
        return counts.most_common(1)[0][0]

49 그룹 애너그램

나의 코드

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        res = []
        check = {}
        for i, st in enumerate(strs):
            data =list(st)
            data.sort()
            data="".join(data)
            if check.get(data) == None:
                check[data]=[i]
            else:
                check[data].append(i)
        
        print(check)
        for che in check.items():
            tmp = []
            for idx in che[1]:
                tmp.append(strs[idx])
            print(tmp)
            res.append(tmp)
        
        return res
                

교재 코드

  • defaultdict 에 대해서 공부할 것!
import collections
from typing import List


class Solution:
    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())

참고 문헌

파이썬 알고리즘 인터뷰 소스 코드

profile
개발하는 코린이

0개의 댓글