[python/leetcode] 937번 reorder log files 문제 풀이
https://leetcode.com/problems/reorder-data-in-log-files
Reorder Data in Log Files - LeetCode
Can you solve this real interview question? Reorder Data in 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
leetcode.com
요약 : 로그를 기준에 맞게 정렬하라
기본 로직은 다음과 같다.
- 문자 로그 먼저, 그 다음에 숫자 로그 순이기 때문에 문자 로그와 숫자 로그를 분리해서 저장한다
- 문자 로그는 내용과 제목(identifier) 기준으로 정렬한다
- 문자 로그 + 숫자 로그 순으로 리턴한다
구현한 코드는 아래와 같다.
def reorderLogFiles(logs):
dig = []
let = []
# 문자 로그와 숫자 로그를 분리해서 저장한다
for log in logs:
if log.split(' ')[1].isdigit():
dig.append(log)
else:
let.append(log)
# 문자 로그 정렬 : 내용을 내림차순으로, 같으면 제목 숫자 기준으로
let = sorted(let, key=lambda l: l.split(' ')[0])
let = sorted(let, key=lambda l: l.split(' ')[1:])
# 문자 로그, 숫자 로그 순으로 리턴
return let + dig
먼저 문자 로그와 숫자 로그를 분리하는 방법으로
하나의 로그를 공백 기준으로 나눠서
1번째 인덱스의 요소가
숫자로 되어있는지(isdigit) 확인했다.
log.split(' ')[1].isdigit()
문자 로그는 2가지 기준으로 정렬해야한다.
- 내용을 기준으로 내림차순 정렬
- 내용이 같다면 제목(identifier)에 있는 숫자 기준으로 정렬
그래서 먼저 identifier 기준으로 정렬한 다음, 내용을 기준으로 정렬해줬다.
sorted는 원본을 바꾸지 않아서, 반환값을 let 리스트에 다시 할당해줬다.
마지막으로 리스트 두 개를 합쳐줘야했는데
파이썬에서는 단순히 + 를 써서 합쳐줄 수 있다.
return let + dig
js였다면 concat 메소드나 rest 연산자를 썼을 것이다.
보완한다면…
- js와 다르게 파이썬은 split할 때 아무것도 넘겨주지 않아도 공백을 기준으로 나뉜다. 따라서 단순히 log.split()[1] 으로 작성해도 된다.
- 문자 로그를 두 가지 기준으로 정렬하기 위해 sorted를 2번 썼는데, 하나로 합칠 수 있었다.
# 문자 로그 정렬 : 내용을 내림차순으로, 같으면 제목 숫자 기준으로
let = sorted(let, key=lambda l: l.split(' ')[0])
let = sorted(let, key=lambda l: l.split(' ')[1:])
# 두가지 기준으로 한번에 정렬
let = sorted(let, key=lambda l: (l.split(' ')[1:], l.split(' ')[0]))
3. 원본 리스트를 수정하고 싶은 경우라서 sorted가 아니라 sort를 썼으면 더 간단했겠다.
# (기존 코드) 반환된걸 다시 할당
let = sorted(...)
# 원본을 바꿈, 반환값 없음
sort(...)