Reorder Data in Log Files

로그 파일을 재정렬하자


문제 이해

937. Reorder Data in Log Files - 문제 링크

문제를 해석해 보자.

logs 배열이 주어진다. 각 log는 공백으로 구분된 단어로 이루어진 문자열이고 첫 번째는 identifier(식별자) 이다.

로그는 두 가지 타입이 있다.

  • letter-logs: 식별자를 제외한 모든 단어가 영문 소문자로 구성됨.
  • digit-logs: 식별자를 제외한 모든 단어가 숫자로 구성됨.

로그 정렬을 수행해야 하는데, 정렬 규칙은 다음과 같다.

  1. 모든 letter-logsdigit-logs보다 앞에 온다.
  2. letter-logs는 식별자를 제외한 문자열을 비교하여 정렬한다. 만약 해당 문자열이 같다면 식별자를 비교하여 정렬한다.
  3. digit-logs는 입력 순서대로 정렬이 유지되어 있어야 한다.

위 세 가지 규칙을 따라 로그를 정렬하고 정렬된 로그를 배열로 반환해라.

뭔가 문제가 길어서 어려워 보이지만 정렬 규칙을 그대로 따라 하기만 하면 쉽게 풀 수 있다.


문제 풀이

문제를 풀기 전에 과정을 정리해보자.

  1. 문자 로그와 숫자 로그를 분리한다.
    숫자 로그는 입력 순서대로 정렬이 유지되어 있어야 하므로 분리할 때 순서가 유지되도록 한다.
  2. 문자 로그를 정렬한다.
    먼저 식별자를 제외한 문자열인 content끼리 비교하여 정렬을 수행하고, 만약 content가 같다면 식별자로 정렬을 수행하도록 한다.
  3. 문자 로그와 숫자 로그를 합친다.

이렇게 과정을 정리하니 문제가 굉장히 쉬워졌다. 이제 이것을 코드로 구현해보자.


코드 구현

reorder-data-in-log-files.py
class Solution:
    def _get_identifier(self, log: str) -> str:
        """로그 문자열에서 식별자(첫 번째 단어)를 추출"""
        return log.split(" ")[0]
 
    def _get_content(self, log: str) -> str:
        """로그 문자열에서 내용(식별자 이후의 모든 것)을 추출"""
        return " ".join(log.split(" ")[1:])
 
    def _is_letter_log(self, log: str) -> bool:
        """로그 내용이 문자로 시작하는지 확인"""
        return log.split(" ")[1].isalpha()
 
    def reorderLogFiles(self, logs: list[str]) -> list[str]:
        # 문자 로그와 숫자 로그 분리
        letter_logs: list[str] = []
        digit_logs: list[str] = []
 
        for log in logs:
            if self._is_letter_log(log):
                letter_logs.append(log)
            else:
                digit_logs.append(log)
 
        # 문자 로그를 내용 기준으로 정렬하고, 내용이 같으면 식별자로 정렬
        letter_logs.sort(
            key=lambda log: (self._get_content(log), self._get_identifier(log))
        )
 
        # 정렬된 문자 로그와 숫자 로그를 결합
        return letter_logs + digit_logs

로그에서 identifier와 content를 추출하는 로직과 문자 로그인지 확인하는 로직을 분리하여 코드를 간결하게 만들었다.

reorderLogFiles 함수 부분만 보면 위에서 정리했던 과정을 그대로 구현한 것을 확인할 수 있다.

  1. _is_letter_log로 문자 로그인지 확인하여 문자 로그는 letter_logs에, 숫자 로그는 digit_logs에 추가한다.
  2. _get_identifier_get_content로 문자 로그의 identifier와 content를 추출하여 정렬한다.
  3. 정렬된 문자 로그와 숫자 로그를 결합하여 반환한다.

마무리

이번 문제는 난이도가 Medium으로 표시되어 있었지만 문제를 꼼꼼히 읽고 그대로 구현하면 쉽게 풀 수 있는 문제였다.


참고&공부 자료