본문 바로가기
Algorithm/LEET CODE ( 파이썬 알고리즘 인터뷰)

[LEET CODE] 937. Reorder Data in Log Files ( lambda 함수, 문자열 확인 함수 )

by newnu 2021. 3. 14.
반응형

# Problem

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:

  1. The letter-logs come before all digit-logs.
  2. The letter-logs are sorted lexicographically by their contents. If their contents are the same, then sort them lexicographically by their identifiers.
  3. The digit-logs maintain their relative ordering.

Return the final order of the logs.

 

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

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

 

Constraints:

  • 1 <= logs.length <= 100
  • 3 <= logs[i].length <= 100
  • All the tokens of logs[i] are separated by a single space.
  • logs[i] is guaranteed to have an identifier and at least one word after the identifier.

 

# My answer

class Solution:
    def reorderLogFiles(self, logs: List[str]) -> List[str]:
        digit_logs=[]
        letter_logs=[]
        answer=[]
        for log1 in logs:
            log = log1.split(" ") #list로 만들기
            #digit-logs / letter-logs 분리 - 문자, 숫자 섞인 로그 있을때
            for i in range(1,len(log)):
                if log[i].isdigit():
                    if i == (len(log)-1):
                        digit_logs.append(log1)      
                else:
                    break
        # logs에서 숫자로그 제외
        for dlogs in digit_logs:
            logs.remove(dlogs)
            
        # 문자로그 정렬
        for log2 in logs:
            log = log2.split(" ",1) # 식별자와 내용 나누기
            letter_logs.append(log)
        
        # 람다식 활용 정렬
        letter_logs_sorted=sorted(letter_logs,key = lambda x : (x[1],x[0]))
        for llog in letter_logs_sorted:
            llog = llog[0]+" "+llog[1] # 로그 다시 이어주기
            answer.append(llog) # answer 리스트에 정렬 순서대로 넣기

        answer = answer+digit_logs
        return answer

 

# Solution1

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

# 람다 표현식

: 식별자 없이 실행 가능한 함수

  함수 선언 없이도 하나의 식으로 함수를 단순하게 표현 가능

  **  코드가 길어질 수 있으니 주의

# 함수 선언하는 경우
def func(x):
	return x.split()[1],x.split()[0]
    
s.sort(key=func)

# 람다식 사용
s.sort(key = lambda x : ( x.split()[1], x.split()[0] )

 

# 문자열이 숫자, 문자인지 확인하기

  3개의 함수 모두 True/ False를 반환하는 Boolean 형

  공백이 포함되어 있으면 False 반환

 

isdigit() : 문자열이 숫자로만 이루어져 있으면 True 반환

isalpha() : 문자열이 문자로만 이루어져 있으면 True 반환

isalnum() : 문자열이 문자 또는 숫자로 이루어져 있으면 True 반환

 

str_1 = "12"
str_2 = "1 2"

str_1.isdigit() # True
str_2.isdigit() # False
반응형