리트코드_937 로그 파일 재정렬_Medium (문자열_정렬_sort()_lambda_더 중요_isalpha()_isdigit())

RostoryT·2022년 9월 18일
0

Sorting and Recursive

목록 보기
11/11



메모

  • <문제> 로그를 재정렬하라. 기준은 다음과 같다

    • 문자가 동일한 경우 식별자 순으로 정렬시킨다.

      • let 또는 dig 또는 a 또는 zo 이런거 바로 뒤 숫자 (let1 -> let2 -> let3)
    • 숫자 로그는 입력된 순서대로 정렬시키고

    • 최종 정렬 결과는 문자로 구성된 로그가 숫자 로그보다 앞에 오도록 정렬

Input: logs = ["dig1 8 1 5 1",
               "let1 art can",
               "dig2 3 6",
               "let2 own kit dig",
               "let3 art zero"]

Output: ["let1 art can",
         "let3 art zero",
         "let2 own kit dig",
         "dig1 8 1 5 1",
         "dig2 3 6"]

알고리즘 및 방법

일단 이중 리스트로 바꿔줘야될듯(각각 single space기준으로) --> tmp
그다음 for i in tmp
        if i[1] == isalpha() 이면
            text_list.append(i)
        else
            num_list.append(i)
            
       text_list.sort(key = lambda x:(x[1:], x[0])  # <---(중요) x[1:] 이게되네 ㄷㄷㄷ
       
       return text_list + num_list

솔루션 코드 - 내가 푼

  • sort(key = lambda x:()) 를 썼는데
    • (x[1:]) 이게 되네...! 슬라이싱 ㄷㄷ
class Solution:
    def reorderLogFiles(self, logs: List[str]) -> List[str]:
        
        tmp = [list(map(str, i.split())) for i in logs] # 내용물을 리스트로 바꾸는
        
        text = []
        num = []
        for i in tmp:
            if i[1].isalpha():
                text.append(i)
            else:
                num.append(i)
        
        text.sort(key = lambda x:(x[1:], x[0]))    # <---(중요) x[1:] 이게되네 ㄷㄷㄷ
        
        ans = [" ".join(i) for i in (text + num)]  # <---(중요) 이게되네 ㄷㄷㄷ
        
        return ans


  • 해설 과정


솔루션 코드 - 책

  • 큰 알고리즘은 나와 같음
    • 나는 초반에 이중 리스트로 만드는게 있어서 시간, 공간이 더 많이 나온 듯
    • <중요> 책 솔루션은 추가로 안만들고 split()을 써서 수행함
      • 그래서 더 효율적인 코드를 작성할 수 있었음
class Solution:
    def reorderLogFiles(self, logs: List[str]) -> List[str]:
        letters, digits = [], []
        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

profile
Do My Best

0개의 댓글