본문 바로가기

개발/Algorithm

[리트코드] Reorder Data in Log Files(python)

리트코드, Reorder Data in Log Files_로그 파일 데이터 재정렬

 

TL;DR

  • 문자열 정렬을 할 수 있는지

문제 분석

1. 기록의 첫 번째 글자는 식별자이다.
2. 영어 소문자로 구성된 문자 기록과 숫자로만 구성된 숫자 기록 두 가지 종류가 있다.
3. 문자 기록은 숫자 기록보다 먼저 와야 한다.
4. 문자 기록은 사전순으로 정렬되며, 만약 같다면 식별자를 사전순으로 정렬해야 한다.
5. 숫자 기록은 입력된 순서대로 정렬된다.

 

- 3 ~ 4 : 문자 기록을 처리해야 하는 방법을 명시하고 있다. 문자 기록은 사전순으로 정렬되어야 하며, 같을 경우는 기록의 가장 처음에 있는 식별자를 사전 순으로 정렬한다.

- 5 : 숫자 기록은 입력 순서대로 정렬한다.

입출력 형태

입출력 예시

 

- 예제 1에서 입력은 5개의 기록(Log)로 구성되어 있다.

- 각 기록의 첫 번째 문자인 dig1, let1, dig2, let2, let3는 식별자이다.

- "let1 art can", "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 = sorted(letters, key=lambda letter: (letter.split(' ')[1:], letter.split(' ')[0]))

        # 두 배열을 합친다.
        for digit in digits:
            letters.append(digit)
            
        return letters

 

- 문자 기록와 숫자 기록을 나누어 저장한다.

- 문자 기록의 경우 문제 조건에 따라 정렬한다.

  - `lambda` : 별도의 함수 선언 없는 일종의 익명 함수의 역할을 수행한다.

                        이 문제에서는 문자 기록 배열 letters의 원소 letter의 각 기록들을 반환하며 key 역할을 하도록 한다.

  - `letter.split(' ')[1:]` : 식별자를 제외한 문자 기록들을 key로 정렬을 수행한다.

  - `letter.split(' ')[0]` : 동일한 문자 기록들에 대해서는 식별자를 key로 정렬을 수행한다.

- 숫자 기록은 입력 순서대로 배열에 저장되어 있으므로 별도의 처리를 하지 않는다.

- 두 배열을 합쳐서 반환한다.

개선된 풀이

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 = sorted(letters, key=lambda letter: (letter.split(' ')[1:], letter.split(' ')[0]))

        # 두 배열을 합친다.
        return letters + digits

 

- 배열을 합치는 방법을 덧셈 연산자(+)를 활용하여 간단하게 작성할 수 있다.

반응형