6장_3 문자열 조작(로그 파일 재정렬)
배열이 제공됩니다. 각 로그는 첫 번째 단어가 식별자인공간 구분된 단어 문자열입니다.
로그의 두 가지 유형이 있습니다.
- 문자 로그: 모든 단어 (식별자를 제외한)는 소문자 영어 문자로 구성됩니다.
- 숫자 로그: 식별자를 제외한 모든 단어는 숫자로 구성됩니다.
- 다음 로그를 다시 정렬합니다.
- 문자 로그는 모든 숫자 로그앞에 옵니다.
- 문자 로그는 내용에 의해 사전적으로 정렬됩니다. 내용이 동일하면 식별자의 순서대로 정렬합니다.
- 숫자 로그는 상대 순서를 유지합니다.
- 로그의 최종 순서를 반환합니다.
예 1:
입력: 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"]
말이 조금 복잡해 보일 수 있는데 문자로 구성된 로그가 숫자로 구성된 모든 로그보다 앞에 오며 숫자는 숫자 순서대로 온다. 그렇다면 문자와 숫자를 구별하게 하고, 내용이 동일하면 식별자 순으로 정렬을 한다는 뜻이다.
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
letters, digits = [], []
문자와 숫자를 저장한다.
if log.split()[1].isdigit(): digits.append(log) else: letters.append(log)
맨 앞은 식별자이니 [1]로 식별자 다음부터 나누는데 숫자라면 digits에 저장, 아니라면(문자라면) letters에 저장한다.
letters.sort(key=lambda x: (x.split()[1:], x.split()[0])) return letters + digits
이후 람다를 사용하여 x.split()[1:]로 split 하는데 식별자 다음 숫자,문자를 비교해야하니 [1:]부터 끝까지 비교를 하여 사전순으로 정렬을 하고 비교한 문자가 일차한다면 그 다음 우선순위로 식별자인 x.split()[0]을 사용하여 정렬한다.
원래는 리스트의 각 요소를 폴어서 별도로 처리를 해야하는데 람다는 간단한 함수를 쉽게 선언하는 방법이다. 그러나 람다 표현식은 코드가 길어지고 map이나 filter와 함께 사용하면 가독성이 떨어질 수 있으므로 주의가 필요하다.
Author And Source
이 문제에 관하여(6장_3 문자열 조작(로그 파일 재정렬)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@dongmin/6장3-문자열-조작로그-파일-재정렬저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)