[문제]
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.
로그를 기준에 맞춰 재정렬 하는 문제이다.
[예시]
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"]
[코드]
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)
letters.sort(key=lambda x: (x.split()[1:], x.split()[0]))
return letters+digits
우선 logs를 탐색하면서 log.split()[1] (예시: 9, 4, off, act) 이 숫자인지 판별한다.
숫자라면 digits 리스트에, 아니라면 letters 리스트에 담는다.
그후 람다를 이용하여 정렬한다.
identifier를 제외한 문자열을 키로 두어서 정렬을 하고, 동일한 경우에는 [0]을 기준으로 정렬되도록 하였다.
마지막으로 모두 이어 붙여서 반환한다.
이 문제에서 핵심은 identifier가 순서에 영향은 끼치지 않지만, 문자가 동일할 때에는 식별자 순서이다.
핵심을 람다를 이용하여 표현하였다. = letters.sort(key=lambda x: (x.split()[1:], x.split()[0]))
문제 싫어요가 좋아요의 두배를 넘길래 왜 그런가 싶었는데.. 아마 문제 해석이 약간 까다로워서인가보다..
눈으로 문제를 슥 훑었을 때 이게 무슨 말인가..싶었다...
참고
'알고리즘 > LeetCode' 카테고리의 다른 글
[파이썬/알고리즘] Leetcode - 1689. Partitioning Into Minimum Number Of Deci-Binary Numb (0) | 2021.06.28 |
---|---|
[자바스크립트/알고리즘] Leetcode - 부분 배열의 최대합 (0) | 2021.03.13 |
[자바스크립트/알고리즘] LeetCode - 회문 정수 (1) | 2021.03.07 |
[자바스크립트/알고리즘] LeetCode - 정렬된 두 리스트 합치기 (0) | 2021.03.07 |