Reorder Data in Log Files
로그 파일을 재정렬하자
문제 이해
937. Reorder Data in Log Files - 문제 링크
문제를 해석해 보자.
logs
배열이 주어진다. 각log
는 공백으로 구분된 단어로 이루어진 문자열이고 첫 번째는identifier
(식별자) 이다.로그는 두 가지 타입이 있다.
letter-logs
: 식별자를 제외한 모든 단어가 영문 소문자로 구성됨.digit-logs
: 식별자를 제외한 모든 단어가 숫자로 구성됨.로그 정렬을 수행해야 하는데, 정렬 규칙은 다음과 같다.
- 모든
letter-logs
는digit-logs
보다 앞에 온다.letter-logs
는 식별자를 제외한 문자열을 비교하여 정렬한다. 만약 해당 문자열이 같다면 식별자를 비교하여 정렬한다.digit-logs
는 입력 순서대로 정렬이 유지되어 있어야 한다.위 세 가지 규칙을 따라 로그를 정렬하고 정렬된 로그를 배열로 반환해라.
뭔가 문제가 길어서 어려워 보이지만 정렬 규칙을 그대로 따라 하기만 하면 쉽게 풀 수 있다.
문제 풀이
문제를 풀기 전에 과정을 정리해보자.
- 문자 로그와 숫자 로그를 분리한다.
숫자 로그는 입력 순서대로 정렬이 유지되어 있어야 하므로 분리할 때 순서가 유지되도록 한다. - 문자 로그를 정렬한다.
먼저 식별자를 제외한 문자열인 content끼리 비교하여 정렬을 수행하고, 만약 content가 같다면 식별자로 정렬을 수행하도록 한다. - 문자 로그와 숫자 로그를 합친다.
이렇게 과정을 정리하니 문제가 굉장히 쉬워졌다. 이제 이것을 코드로 구현해보자.
코드 구현
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
함수 부분만 보면 위에서 정리했던 과정을 그대로 구현한 것을 확인할 수 있다.
_is_letter_log
로 문자 로그인지 확인하여 문자 로그는letter_logs
에, 숫자 로그는digit_logs
에 추가한다._get_identifier
와_get_content
로 문자 로그의 identifier와 content를 추출하여 정렬한다.- 정렬된 문자 로그와 숫자 로그를 결합하여 반환한다.
마무리
이번 문제는 난이도가 Medium으로 표시되어 있었지만 문제를 꼼꼼히 읽고 그대로 구현하면 쉽게 풀 수 있는 문제였다.