Python - 로그파일 재정렬

개발자·2021년 11월 16일

알고리즘

목록 보기
3/5
post-thumbnail

파이썬을 이용한 알고리즘 공부 내용을 정리합니다.


문제

LeetCode-937

로그를 재정렬하라. 기준은 다음과 같다.

  • 각 로그는 공백으로 구분된 단어 문자열이며 첫 번째 단어는 식별자 입니다.
  • 두 가지 유형의 로그가 있습니다.
    Letter-logs : 모든 단어(식별자 제외)는 영문 소문자로 구성됩니다.
    Digit-logs : 모든 단어(식별자 제외)는 숫자로 구성됩니다.

다음과 같이 로그를 재정렬합니다.

  • Letter-logs는 Digit-logs보다 앞에 온다.
  • 식별자는 순서에 영향을 끼치지 않지만, 문자가 동일한 경우 식별자 순으로 한다.
  • Digit-logs는 입력순서대로 한다.

예시1

Input: logs = ["dig1 8 1 5 1","let1 art can","dig2 3 6","let2 own kit dig","let3 art zero"]
Output: ["let1 art can","let3 art zero","let2 own kit dig","dig1 8 1 5 1","dig2 3 6"]

예시2

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"]


람다와 + 연산자를 이용

def reorderLogFiles(self, logs: List[str]) -> List[str]:
   letters, digits = [], []					#문자로그, 숫자로그를 저장할 리스트를 선언해준다.
   for log in logs:						
      if log.split()[1].isdigit():				#속성을 split하여 식별자를 제외한 후 문자인지 숫자인지 판별
         digits.append(log)					#숫자라면 digit리스트에 추가
      else:
         letters.append(log)					#문자라면 letters리스트에 추가
   #letters를 람다식을 사용해 기준대로 정렬한다.
   letters.sort(key=lambda x: (x.split()[1:], x.split()[0]))	#letters의 각 속성에서 식별자를 제외한 내용들을 오름차순으로 정렬하고, 내용이 같을경우 후순위로 식별자에 따라 정렬한다.
   return letters + digits					#+를 이용해 두 리스트를 합쳐준다.

주요 내용

  • split()함수에 매개변수가 없다면 공백이나 엔터를 기준으로 나눈다.
  • split()의 결과는 리스트로 반환
  • isdigit()은 숫자인지 판별(숫자일때 참)
  • sort()는 기본적으로 오름차순이며 key를 매개변수로 하여 기준을 바꿀수 있다.
    (예: sort(key=len(변수))로 하여 속성의 길이를 기준으로 오름차순 정렬)
  • 변수.split()[1:]은 split한 결과의 1번부터 그 뒤의 모든 결과를 반환한다.
  • (lamda 매개변수: return값)(전달인자)

결과

람다는 편리하고 있어보이지만 코드가 길어지고 map이나 filter와 함께 사용하면 가독성이 떨어지니 주의가 필요하다.
리스트 컴프리헨션을 사용도록 하자.

profile
Beginner

0개의 댓글