[LeetCode] 937. Reorder Data in Log Files 파이썬 풀이

헬리코박도·2021년 12월 1일
0
post-thumbnail

https://leetcode.com/problems/reorder-data-in-log-files/

문제 설명

주어진 로그의 배열을 조건에 맞게 재정렬한 배열을 반환하는 문제이다.

로그 내부는 스페이스로 구분되며 첫 어절은 식별자이다.
식별자를 제외한 모든 어절은 알파벳 소문자 혹은 숫자로만 이루어져 있다. 둘이 섞인 경우는 없다.

"dig1 8 1 5 1"
"let1 art can"

로그는 이렇게 생겼는데 보다시피 식별자를 제외하면 일관되게 알파벳 소문자 아니면 숫자다.

식별자가 조금 낚시인데 숫자 로그는 digit이란 의미에서 dig고 문자 로그는 letter라는 의미에서 let을 붙인 것 같지만 문제에 그런 규칙은 없다. 절대 이걸로 숫자 로그인지 문자 로그인지 판별하는 코드를 짜면 안 된다. 예시와는 다르게 테스트 케이스에서는 식별자가 어떻게 구성될지 모르니까...

재정렬 조건은 3가지이다.

  • 문자 로그는 숫자 로그보다 앞에 와야 한다.
  • 문자 로그는 사전 순서로(lexicographically 여기서 처음 본 단어다.) 정렬되어야 하는데 컨텐츠(식별자를 제외한 로그들)가 완전히 동일하면 식별자의 사전 순서로 정렬한다.
  • 숫자로그는 기존의 입력 순서를 그대로 유지한다.

코드 구현

우선 숫자 로그와 문자 로그를 구분해줘야 할 것이다. 위에다 적었듯이 식별자로 구분하면 안 된다. 두번째 자리가 문자인지 숫자인지 여부로 구분하는 게 제일 편할 것이다.

그렇게 하기 위해서는 공백으로 구분된 로그를 분리해주어야 할 것이다. 이 때 쓸 만한 것이 바로 파이썬에 내장된 split() 메소드이다. 문자열에서 split() 메소드를 사용하면 공백을 기준으로 문자열 나눈 배열을 반환해준다. 그 배열의 두 번째 원소에 isalpha()나 isdigit() 메소드를 적용하면 문자 로그인지 숫자 로그인지 알 수 있을 것이다.

일단 구분을 해주면 1번과 3번 조건을 해결이 가능하다. 문자 로그가 담긴 배열 따로 숫자 로그가 담긴 배열 따로 구분해주고 마지막에 문자 로그 배열이 먼저 오도록 합쳐주면 1번이 해결 가능하고 들어온 순서 그대로 유지되도록 숫자 로그 배열에 담아주면 3번도 해결이 가능하니까

2번은 파이썬도 그렇고 보통 정렬 함수들이 어떤 기준으로 정렬을 할 지 패러미터로 줄 수 있으니까 이를 통해 해결할 수 있을 것이다.

split과 sort의 key 패러미터 사용

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

위에서 말한대로 split()을 통해 로그를 분해해서 문자, 숫자 로그를 판별하고 배열에 각각 담아주었다.

이후 문자 로그 배열은 정렬해주는데 정렬 기준으로 람다 함수를 작성했다.
x.split()[1:]이 첫 번째 정렬 기준이다. [1:]이면 두 번째부터 끝까지 슬라이싱 되니까 식별자를 제외한 문자를 의미한다. 식별자를 제외한 문자들이 모두 동일할 경우 두 번째 정렬 기준으로 x.split()[0], 즉, 식별자의 사전 순서로 비교할 것이다.

마지막으로 파이썬에서 리스트는 + 연산자로 합칠 수 있다. 문자 로그 배열 let이 앞으로 가게 let + dig하여 반환해주었다.

profile
Data Engineer

0개의 댓글