문제 링크:
https://leetcode.com/problems/reorder-data-in-log-files/
문제는 다음과 같다.
로그를 재정렬한다.
1. 로그의 가장 앞에 있는 문자열은 식별자다.
2. 문자로 구성된 로그가 숫자 로그보다 먼저 온다.
3. 식별자는 순서에 영향을 미치지 않고, 문자가 동일한 경우에만 식별자순으로 정렬한다.
4. 숫자 로그는 입력 순서대로 한다.
문제는 단순하다. 문자로 구성된 로그는 항상 숫자로 구성된 로그보다 앞에 오며, 숫자 로그는 들어온 순서 그대로 존재한다.
로그의 형태는 다음과 같다.
logs = ["dig1 8 1 5 1","let1 art can","dig2 3 6","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"]
문자로 구성된 로그가 앞에 오면서, 식별자 'let~' 뒤의 문자열을 기준으로 정렬되어있다. 그 이후에는 숫자로 구성된 로그가 자리하게 되는데, 모두 기존에 입력으로 존재했던, 숫자 구성로그의 입력순서 그대로 존재한다.
정답 코드는 다음과 같다.
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)
# 2개의 키를 람다표현식으로 정렬
# 1차적으로 식별자를 제외한 로그를 기준으로 sort를 하게되고,
# 동일한 순위의 경우 후순위 기준인 식별자를 기준으로 sort하게된다.
letters.sort(key=lambda x: (x.split()[1:], x.split()[0]))
return letters + digits
문자열에 대해 isdigit() 함수를 사용하여, 해당 문자열이 숫자로 이루어진 문자열인지에 대해 판별한다. 숫자로 이루어진 문자열인 경우 해당 로그를 digits 리스트에 append하고, 문자로 이루어진 문자열인 경우에는 letters 리스트에 append하게 된다.
문자열로 이루어진 로그와, 숫자로 이루어진 로그를 각각 letters, digits 리스트에 정리하고, 이를 list에 대한 sort 함수로 문자 순으로 정렬합니다.
sort함수를 사용할 때의 키는 람다를 통해 정의합니다. 첫 번째 인자로 들어간 x.split()[1:]은 식별자를 제외한 문자열을 기준으로 한다는 의미이고, 두 번째 인자로 들어간 x.split()[0]은 식별자를 제외한 문자열을 key로 sort할 때 동일선상에 있는 문자열에 대해, 식별자를 키로 적용한다는 의미이다.
그리고 최종적으로는 '+'로 letters와 digits 리스트를 연결하여 return하여 코드가 마무리됩니다.