6장_3 문자열 조작(로그 파일 재정렬)

배열이 제공됩니다. 각 로그는 첫 번째 단어가 식별자인공간 구분된 단어 문자열입니다.
로그의 두 가지 유형이 있습니다.

  • 문자 로그: 모든 단어 (식별자를 제외한)는 소문자 영어 문자로 구성됩니다.
  • 숫자 로그: 식별자를 제외한 모든 단어는 숫자로 구성됩니다.
  1. 다음 로그를 다시 정렬합니다.
  2. 문자 로그는 모든 숫자 로그앞에 옵니다.
  3. 문자 로그는 내용에 의해 사전적으로 정렬됩니다. 내용이 동일하면 식별자의 순서대로 정렬합니다.
  4. 숫자 로그는 상대 순서를 유지합니다.
  5. 로그의 최종 순서를 반환합니다.

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

말이 조금 복잡해 보일 수 있는데 문자로 구성된 로그가 숫자로 구성된 모든 로그보다 앞에 오며 숫자는 숫자 순서대로 온다. 그렇다면 문자와 숫자를 구별하게 하고, 내용이 동일하면 식별자 순으로 정렬을 한다는 뜻이다.

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
 letters, digits = [], [] 

문자와 숫자를 저장한다.

            if log.split()[1].isdigit():
                digits.append(log)
            else:
                letters.append(log) 

맨 앞은 식별자이니 [1]로 식별자 다음부터 나누는데 숫자라면 digits에 저장, 아니라면(문자라면) letters에 저장한다.

        letters.sort(key=lambda x: (x.split()[1:], x.split()[0]))
        return letters + digits

이후 람다를 사용하여 x.split()[1:]로 split 하는데 식별자 다음 숫자,문자를 비교해야하니 [1:]부터 끝까지 비교를 하여 사전순으로 정렬을 하고 비교한 문자가 일차한다면 그 다음 우선순위로 식별자인 x.split()[0]을 사용하여 정렬한다.

원래는 리스트의 각 요소를 폴어서 별도로 처리를 해야하는데 람다는 간단한 함수를 쉽게 선언하는 방법이다. 그러나 람다 표현식은 코드가 길어지고 map이나 filter와 함께 사용하면 가독성이 떨어질 수 있으므로 주의가 필요하다.

좋은 웹페이지 즐겨찾기