반응형

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

 

Reorder Data in Log Files - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

<문제 조건>

  1. 로그의 가장 앞 부분은 식별자다.
  2. 문자로 구성된 로그가 숫자 로그보다 앞에 온다.
  3. 식별자는 순서에 영향을 끼치지 않지만, 문자가 동일할 경우 식별자 순으로 한다.
  4. 숫자 로그는 입력 순서대로 한다.
  • 각 리스트에 주어진 문자열에서 맨 처음에 오는 단어는 식별자이다. 식별자를 제외하고 뒤에 오는 단어들을 기준으로 정렬해줘야 한다.
  • 문제 조건으로 문자로 구성된 로그가 숫자보다 먼저 온다고 하였으므로, 문자열로 구성된 로그와 숫자로 구성된 로그를 각각 구분하여 리스트에 저장해준다.
  • 숫자 로그는 입력 순서대로 한다고 하였으므로, 따로 정렬해주지 않는다. 하지만 문자열 로그는 단어 순서대로 정렬해줘야 하므로 리스트의 sort()함수에 key값을 줘서 어떤 것을 기준으로 정렬할 것인지 알려줘야 한다.
  • 먼저 split()함수를 사용하여 공백을 기준으로 문자열을 각 단위별로 구분해준다. 식별자 뒤에 등장하는 단어들을 기준으로 정렬해야 하므로 단어들이 위치한 인덱스인 [1:]을 써준다. 그리고 만약 "let1 art can","let3 art zero" 혹은 "let1 art can","let1 art zero" 처럼 art가 겹치는 경우에는 맨 앞에 있는 식별자를 기준으로 구분해줘야 하므로 식별자가 위치한 인덱스 [0]을 써준다. 이렇게 2개의 기준을 한 쌍으로 정렬하게 해야 하므로 겉에 ()를 써서 감싸준다.
class Solution:
    def reorderLogFiles(self, logs: List[str]) -> List[str]:
        digit_list = []     # 숫자 로그 리스트
        string_list = []    # 문자열 로그 리스트
        
        for log in logs:
            if log.split()[1].isdigit():    # 맨 앞의 식별자를 빼고 난 다음에 오는 로그가 문자열인지 숫자인지 판단하여 각각의 리스트에 저장
                digit_list.append(log)
            else:
                string_list.append(log)    
        
        string_list.sort(key = lambda stlist : (stlist.split()[1:], stlist.split()[0])) 
        # 공백을 기준으로 문자열 로그를 word단위로 각각 구분해준다.
        # 로그의 식별자를 제외하고 등장하는 문자열들을 비교하여 순차적으로 나열 & 식별자를 기준으로 순차적으로 나열
        # 위 2개의 기준을 한쌍으로 넘겨 문자열 로그를 정렬한다.

        sorted_logs = string_list + digit_list  # 정렬된 문자열 로그와 숫자 로그 리스트를 합친 로그 생성
        return sorted_logs


"""
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"]
"""
반응형

+ Recent posts