[Algorithm] LeetCode #937 - Reorder Log Files
개요
LeetCode #937, Reorder Log Files 문제를 풀어봅니다.
You are given an array of logs. Each log is a space-delimited string of words, where the first word is the identifier.
There are two types of logs:
- Letter-logs: All words (except the identifier) consist of lowercase English letters.
- Digit-logs: All words (except the identifier) consist of digits.
Reorder these logs so that:
- The letter-logs come before all digit-logs.
- The letter-logs are sorted lexicographically by their contents. If their contents are the same, then sort them lexicographically by their identifiers.
- The digit-logs maintain their relative ordering.
Return the final order of the logs.
Example 1:
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”] Explanation: The letter-log contents are all different, so their ordering is “art can”, “art zero”, “own kit dig”. The digit-logs have a relative order of “dig1 8 1 5 1”, “dig2 3 6”.
Example 2:
Input: logs = [“a1 9 2 3 1”,”g1 act car”,”zo4 4 7”,”ab1 off key dog”,”a8 act zoo”] Output: [“g1 act car”,”a8 act zoo”,”ab1 off key dog”,”a1 9 2 3 1”,”zo4 4 7”]
Constraints:
1 <= logs.length <= 1003 <= logs[i].length <= 100- All the tokens of
logs[i]are separated by a single space. logs[i]is guaranteed to have an identifier and at least one word after the identifier.
LeetCode는 Solution class 안에서 작동하게 만들어 놓아서 제시된 template 그대로 가져왔습니다. 입력으로 logs 리스트를 받는데 나중에 식별자와 문자를 분리해야 한다고 하니까 식별자와 문자를 담아줄 리스트 2개를 만듭니다. logs 리스트에서 각각의 log들을 보는데, 맨 앞에 있는 dig1, let1 이런 것은 별 의미가 없고 그 뒤에 나오는 것이 문자인지 숫자인지 판단해야 합니다. log들을 split으로 나누고 isdigit으로 숫자인지 판단합니다. 입력인 logs 리스트 특성 상 식별자 - 문자 몇 개 - 식별자 - 문자 몇 개 형식이라 식별자는 정렬 안 해도 됩니다. 문자열만 있는 letters에서 문자열 우선, 식별자 후순위로 정렬하라고 하니 그렇게 정렬합니다.
class Solution:
def reorderLogFiles(self, logs: List[str]) -> List[str]:
letters = []
digits = []
for log in logs:
# "dig1 8 1 5 1" --> dig1, 8, 1, 5, 1 --> 8
if log.split()[1].isdigit():
digits.append(log)
else:
letters.append(log)
letters.sort(key=lambda x: (x.split()[1:], x.split()[0]))
return letters + digits
