리트코드, Reorder Data in Log Files_로그 파일 데이터 재정렬
TL;DR
- 문자열 정렬을 할 수 있는지
문제 분석
1. 기록의 첫 번째 글자는 식별자이다.
2. 영어 소문자로 구성된 문자 기록과 숫자로만 구성된 숫자 기록 두 가지 종류가 있다.
3. 문자 기록은 숫자 기록보다 먼저 와야 한다.
4. 문자 기록은 사전순으로 정렬되며, 만약 같다면 식별자를 사전순으로 정렬해야 한다.
5. 숫자 기록은 입력된 순서대로 정렬된다.
- 3 ~ 4 : 문자 기록을 처리해야 하는 방법을 명시하고 있다. 문자 기록은 사전순으로 정렬되어야 하며, 같을 경우는 기록의 가장 처음에 있는 식별자를 사전 순으로 정렬한다.
- 5 : 숫자 기록은 입력 순서대로 정렬한다.
입출력 형태
- 예제 1에서 입력은 5개의 기록(Log)로 구성되어 있다.
- 각 기록의 첫 번째 문자인 dig1, let1, dig2, let2, let3는 식별자이다.
- "let1 art can", "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"은 숫자 기록이다. 입력 순서대로 유지한다.
풀이
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 = sorted(letters, key=lambda letter: (letter.split(' ')[1:], letter.split(' ')[0]))
# 두 배열을 합친다.
for digit in digits:
letters.append(digit)
return letters
- 문자 기록와 숫자 기록을 나누어 저장한다.
- 문자 기록의 경우 문제 조건에 따라 정렬한다.
- `lambda` : 별도의 함수 선언 없는 일종의 익명 함수의 역할을 수행한다.
이 문제에서는 문자 기록 배열 letters의 원소 letter의 각 기록들을 반환하며 key 역할을 하도록 한다.
- `letter.split(' ')[1:]` : 식별자를 제외한 문자 기록들을 key로 정렬을 수행한다.
- `letter.split(' ')[0]` : 동일한 문자 기록들에 대해서는 식별자를 key로 정렬을 수행한다.
- 숫자 기록은 입력 순서대로 배열에 저장되어 있으므로 별도의 처리를 하지 않는다.
- 두 배열을 합쳐서 반환한다.
개선된 풀이
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 = sorted(letters, key=lambda letter: (letter.split(' ')[1:], letter.split(' ')[0]))
# 두 배열을 합친다.
return letters + digits
- 배열을 합치는 방법을 덧셈 연산자(+)를 활용하여 간단하게 작성할 수 있다.
'개발 > Algorithm' 카테고리의 다른 글
[리트코드] Group Anagrams(python) (0) | 2021.05.31 |
---|---|
[리트코드] Most Common Word(python) (0) | 2021.05.31 |
[리트코드] Reverse String(python) (0) | 2021.05.28 |
[리트코드] Valid Palindrome(python) (0) | 2021.05.28 |
[프로그래머스] 로또의 최고 순위와 최저 순위(python) (0) | 2021.05.27 |